From 31f917d37d740be8017d701a7ba1ee04e5ce1b46 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 29 May 2024 12:04:42 -0400 Subject: [PATCH 01/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] additional comments --- contracts/gas-snapshots/ccip.gas-snapshot | 4 +-- .../ccip/applications/external/CCIPClient.sol | 5 +-- .../applications/external/CCIPClientBase.sol | 36 ++++++++++++++----- .../applications/external/CCIPReceiver.sol | 22 ++++++------ .../external/CCIPReceiverWithACK.sol | 11 +++--- .../ccip/applications/external/CCIPSender.sol | 3 +- .../external/CCIPReceiverTest.t.sol | 2 -- 7 files changed, 51 insertions(+), 32 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index c2a26ca75f..04def4f478 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -93,12 +93,12 @@ CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428817) CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444784) CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425167) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423774) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 420799) CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18806) CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55172) CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331323) CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437616) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2641285) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2643085) CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72519) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 98d5b0772e..7376a3cabf 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -22,6 +22,7 @@ contract CCIPClient is CCIPReceiverWithACK { return "CCIPClient 1.0.0-dev"; } + /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, @@ -64,8 +65,8 @@ contract CCIPClient is CCIPReceiverWithACK { return messageId; } - /// CCIPReceiver processMessage to make easier to modify - /// @notice function requres that + /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received + /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 6b0844ed3f..09a532c20e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -25,16 +25,14 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { struct ChainConfig { bool disabled; - bytes recipient; - // Includes additional configs such as manual gas limit, and OOO-execution. - // Should not be supplied at runtime to prevent unexpected contract behavior - bytes extraArgsBytes; - mapping(bytes => bool) approvedSender; + bytes recipient; // The address to send messages to on the destination-chain, abi.encode(addr) if an EVM-compatible networks + bytes extraArgsBytes; // Includes additional configs such as manual gas limit, and out-of-order-execution. Should not be supplied at runtime to prevent unexpected contract behavior + mapping(bytes recipient => bool isApproved) approvedSender; } address internal immutable i_ccipRouter; - mapping(uint64 => ChainConfig) public s_chainConfigs; + mapping(uint64 destChainSelector => ChainConfig) public s_chainConfigs; constructor(address router) { if (router == address(0)) revert ZeroAddressNotAllowed(); @@ -60,6 +58,8 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Sender/Receiver Management │ // ================================================================ + /// @notice modify the list of approved source-chain contracts which can send messages to this contract through CCIP + /// @dev removes are executed before additions, so a contract present in both will be approved at the end of execution function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes @@ -73,6 +73,10 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { } } + /// @notice Return whether a contract on the specified source chain is authorized to send messages to this contract through CCIP + /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain + /// @param senderAddr The address which sent the message on the source-chain, abi-encoded if evm-compatible + /// @return bool Whether the address is approved or not to invoke functions on this contract function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } @@ -81,14 +85,21 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - /// @notice function is set in client base to support native-fee-token pre-funding in all children implemending CCIPSend + /// @notice function support native-fee-token pre-funding in all children implementing the ccipSend function receive() external payable {} + /// @notice Allow the owner to recover any native-tokens sent to this contract out of error. + /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// @param to A payable address to send the recovered tokens to + /// @param amount the amount of native tokens to recover, denominated in wei function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); } - /// @notice Function should NEVER be used for transfering tokens from a failed message, only for recovering tokens sent in error + /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error. + /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// @param to A payable address to send the recovered tokens to + /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); } @@ -97,6 +108,10 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Chain Management │ // ================================================================ + /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP + /// @param chainSelector A unique CCIP-specific identifier for the source chain + /// @param recipient The address a message should be sent to on the destination chain. There should only be one per-chain, and is abi-encoded if EVM-compatible. + /// @param _extraArgsBytes additional optional ccipSend parameters. Do not need to be set unless necessary based on the application-logic function enableChain( uint64 chainSelector, bytes calldata recipient, @@ -106,18 +121,21 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { currentConfig.recipient = recipient; + // Set any additional args such as enabling out-of-order execution or manual gas-limit if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; // If config was previously disabled, then re-enable it; if (currentConfig.disabled) currentConfig.disabled = false; } + /// @notice Mark a chain as not supported for sending-receiving messages to/from this contract via CCIP. + /// @dev If a chain needs to be re-enabled after being disabled, the owner must call enableChain() to support it again. function disableChain(uint64 chainSelector) external onlyOwner { s_chainConfigs[chainSelector].disabled = true; } modifier isValidChain(uint64 chainSelector) { - // Must be storage and not memory because the struct contains a nested mapping + // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; if (currentConfig.recipient.length == 0 || currentConfig.disabled) revert InvalidChain(chainSelector); _; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index b95d2cfcb1..b6dc6fc8b0 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -24,7 +24,6 @@ contract CCIPReceiver is CCIPClientBase { enum ErrorCode { // RESOLVED is first so that the default value is resolved. RESOLVED, - // Could have any number of error codes here. FAILED, ABANDONED } @@ -75,11 +74,8 @@ contract CCIPReceiver is CCIPClientBase { emit MessageSucceeded(message.messageId); } - /// @notice This function the entrypoint for this contract to process messages. - /// @param message The message to process. - /// @dev This example just sends the tokens to the owner of this contracts. More - /// interesting functions could be implemented. - /// @dev It has to be external because of the try/catch. + /// @notice Contains arbitrary application-logic for incoming CCIP messages. + /// @dev It has to be external because of the try/catch of ccipReceive() which invokes it function processMessage(Client.Any2EVMMessage calldata message) external virtual @@ -91,9 +87,11 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== - /// @notice This function is called when the initial message delivery has failed but should be attempted again with different logic - /// @dev By default this function is callable by anyone, and should be modified if special access control is needed. - function retryFailedMessage(bytes32 messageId) external onlyOwner { + /// @notice Execute a message that failed initial delivery, but with different logic specifically for re-execution. + /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. + /// @dev function will revert if the messageId was not already stored as having failed its initial execution + /// @param messageId the unique ID of the CCIP-message which failed initial-execution. + function retryFailedMessage(bytes32 messageId) external { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); // Set the error code to 0 to disallow reentry and retry the same failed message @@ -109,9 +107,10 @@ contract CCIPReceiver is CCIPClientBase { emit MessageRecovered(messageId); } - /// @notice Function should contain any special logic needed to "retry" processing of a previously failed message. + /// @notice A function that should contain any special logic needed to "retry" processing of a previously failed message. /// @dev if the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual {} + /// @dev function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner {} /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. @@ -134,6 +133,7 @@ contract CCIPReceiver is CCIPClientBase { // ================================================================ /// @param messageId the ID of the message delivered by the CCIP Router + /// @return Any2EVMMessage a standard CCIP message for EVM-compatible networks function getMessageContents(bytes32 messageId) public view returns (Client.Any2EVMMessage memory) { return s_messageContents[messageId]; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 310182b311..aee2b4686d 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -76,8 +76,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit FeeTokenModified(oldFeeToken, token); } - /// @notice The entrypoint for the CCIP router to call. This function should - /// never revert, all errors should be handled internally in this contract. + /// @notice The entrypoint for the CCIP router to call. This function should never revert, all errors should be handled internally in this contract. /// @param message The message to process. /// @dev Extremely important to ensure only router calls this. function ccipReceive(Client.Any2EVMMessage calldata message) @@ -101,15 +100,16 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageSucceeded(message.messageId); } - /// CCIPReceiver processMessage to make easier to modify - /// @notice Function does NOT require the status of an incoming ACK be "sent" because this implementation does not send, only receives + /// @notice Application-specific logic for incoming ccip-messages. + /// @dev Function does NOT require the status of an incoming ACK be "sent" because this implementation does not send, only receives + /// @dev Any MessageType encoding is implemented by the sender-contract, and is not natively part of CCIP-messages. function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. - // If the message was outgoing, then send an ack response. + // If the message was outgoing on the source-chain, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { // Decode message into the message header and the messageId to ensure the message is encoded correctly @@ -132,6 +132,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { function _sendAck(Client.Any2EVMMessage calldata incomingMessage) internal { Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0); + // Build the outgoing ACK message, with no tokens, with data being the concatenation of the acknowledgement header and incoming-messageId Client.EVM2AnyMessage memory outgoingMessage = Client.EVM2AnyMessage({ receiver: incomingMessage.sender, data: abi.encode(ACK_MESSAGE_HEADER, incomingMessage.messageId), diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 6590c495a3..88f7d20ff9 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -37,6 +37,7 @@ contract CCIPSender is CCIPClientBase { return "CCIPSender 1.0.0-dev"; } + /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] calldata tokenAmounts, @@ -52,7 +53,7 @@ contract CCIPSender is CCIPClientBase { }); for (uint256 i = 0; i < tokenAmounts.length; ++i) { - // Transfer the tokens to pay for tokens in tokenAmounts + // Transfer the tokens to this contract to pay the router for the tokens in tokenAmounts IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index 375d84d501..e64a5d28ab 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -178,8 +178,6 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { // Check that message status is failed assertEq(s_receiver.getMessageStatus(messageId), 1); - uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); - vm.startPrank(OWNER); vm.expectEmit(); From 1e907e9e16c19c5dcdd95811ad267ffa6dd0b30f Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 00:44:13 +0000 Subject: [PATCH 29/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 18 +++++++++--------- .../generated/ccipReceiver/ccipReceiver.go | 18 +++++++++--------- .../ccip/generated/ccipSender/ccipSender.go | 16 ++++++++-------- .../generated/ping_pong_demo/ping_pong_demo.go | 18 +++++++++--------- .../self_funded_ping_pong.go | 18 +++++++++--------- ...wrapper-dependency-versions-do-not-edit.txt | 12 ++++++------ 6 files changed, 50 insertions(+), 50 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 1b906234e0..46b239bdb2 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620045573803806200455783398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e7f620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bda01528181611ca301528181611d7b015281816125fb01526126c70152613e7f6000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b806341eade46116101385780635e35359e116101125780635e35359e146103145780636939cd97146103345780636d62d6331461036157600080fd5b806341eade46146102a65780635075a9d4146102c6578063536c6bfa146102f457600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d33565b60086020526000908152604090205460ff1681565b6040516101cd9190612d7b565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e1b565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e92565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f1d565b34801561028357600080fd5b50610297610292366004612f30565b610721565b6040516101cd93929190612f4d565b3480156102b257600080fd5b506102266102c1366004612f30565b610858565b3480156102d257600080fd5b506102e66102e1366004612d33565b6108a3565b6040519081526020016101cd565b34801561030057600080fd5b5061022661030f366004612f84565b6108b6565b34801561032057600080fd5b5061022661032f366004612fb0565b6108cc565b34801561034057600080fd5b5061035461034f366004612d33565b6108fa565b6040516101cd919061304e565b34801561036d57600080fd5b5061022661037c3660046130eb565b610b05565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613160565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131cc565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131cc565b6113f8565b3480156104ca57600080fd5b506102266104d9366004613207565b611615565b3480156104ea57600080fd5b506102266104f9366004612d33565b611696565b6102e661050c3660046133f0565b6118ff565b34801561051d57600080fd5b5061022661052c366004612e92565b611e83565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d90859085906134fd565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e97565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f1a565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61211a565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff90921692916107479061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546107739061350d565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d59061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546108019061350d565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e97565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b060048361221e565b92915050565b6108be611e97565b6108c88282612231565b5050565b6108d4611e97565b6108f573ffffffffffffffffffffffffffffffffffffffff8416838361238b565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109699061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546109959061350d565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081526020016003820180546109fb9061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a279061350d565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610aa2565b505050915250909392505050565b610b0d611e97565b6001610b1a60048461221e565b14610b59576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b698260025b600491906123e1565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610bb19061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd9061350d565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b50505050508152602001600382018054610c439061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f9061350d565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d3f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cea565b5050505081525050905060005b816080015151811015610dce57610dc68383608001518381518110610d7357610d73613560565b60200260200101516020015184608001518481518110610d9557610d95613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661238b9092919063ffffffff16565b600101610d4c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b50565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e97565b60005b818110156110075760026000848484818110610f4557610f45613560565b9050602002810190610f57919061358f565b610f65906020810190612f30565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613560565b9050602002810190610fae919061358f565b610fbc9060208101906135cd565b604051610fca9291906134fd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613560565b905060200281019061103d919061358f565b61104b906020810190612f30565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613560565b9050602002810190611094919061358f565b6110a29060208101906135cd565b6040516110b09291906134fd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b50565b61117e6040820160208301612f30565b61118b60408301836135cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e99250849150613632565b9081526040519081900360200190205460ff1661123457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b509190612f1d565b6112446040840160208501612f30565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c9061350d565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa908890600401613746565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b5061136586356001610b60565b508535600090815260036020526040902086906113828282613b18565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f1d565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135cd565b81019061144d9190613c12565b905060008160400151600181111561146757611467612d4c565b03611475576108c8826123f6565b60018160400151600181111561148d5761148d612d4c565b036108c85760008082602001518060200190518101906114ad9190613cbe565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d4c565b146115a4576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e97565b67ffffffffffffffff851660009081526002602052604090206001810161164585878361389c565b50811561165d576002810161165b83858361389c565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b61169e611e97565b60016116ab60048361221e565b146116e5576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b6116f0816000610b60565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117389061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546117649061350d565b80156117b15780601f10611786576101008083540402835291602001916117b1565b820191906000526020600020905b81548152906001019060200180831161179457829003601f168201915b505050505081526020016003820180546117ca9061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546117f69061350d565b80156118435780601f1061181857610100808354040283529160200191611843565b820191906000526020600020905b81548152906001019060200180831161182657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118c65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611871565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192b9061350d565b1590508061193a5750805460ff165b1561197d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119b09061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc9061350d565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a889061350d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab49061350d565b8015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b5050505050815250905060005b8651811015611c6257611b7e3330898481518110611b2e57611b2e613560565b6020026020010151602001518a8581518110611b4c57611b4c613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127a7909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611bae57611bae613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5a57611c5a7f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0b57611c0b613560565b602002602001015160200151898481518110611c2957611c29613560565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661211a9092919063ffffffff16565b600101611b0e565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cda908b908690600401613d3f565b602060405180830381865afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b9190613e02565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d6157600754611d619073ffffffffffffffffffffffffffffffffffffffff163330846127a7565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611db0576000611db2565b825b8a856040518463ffffffff1660e01b8152600401611dd1929190613d3f565b60206040518083038185885af1158015611def573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e149190613e02565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e8b611e97565b611e9481612805565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b50565b565b801580611fba57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613e02565b155b612046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526128fa565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190613e02565b6121bf9190613e1b565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122189085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612098565b50505050565b600061222a8383612a06565b9392505050565b8047101561229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122f5576040519150601f19603f3d011682016040523d82523d6000602084013e6122fa565b606091505b50509050806108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612098565b60006123ee848484612a90565b949350505050565b6040805160008082526020820190925281612433565b604080518082019091526000808252602082015281526020019060019003908161240c5790505b50905060006040518060a0016040528084806040019061245391906135cd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124d49288359101613e2e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600291600091612544918901908901612f30565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020180546125749061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546125a09061350d565b80156125ed5780601f106125c2576101008083540402835291602001916125ed565b820191906000526020600020905b8154815290600101906020018083116125d057829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126489190612f30565b846040518363ffffffff1660e01b8152600401612666929190613d3f565b602060405180830381865afa158015612683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a79190613e02565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126fc5760006126fe565b835b61270e6040890160208a01612f30565b866040518463ffffffff1660e01b815260040161272c929190613d3f565b60206040518083038185885af115801561274a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061276f9190613e02565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122189085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612098565b3373ffffffffffffffffffffffffffffffffffffffff821603612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b50565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aad9092919063ffffffff16565b8051909150156108f5578080602001905181019061297a9190613e50565b6108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b50565b600081815260028301602052604081205480151580612a2a5750612a2a8484612abc565b61222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b50565b600082815260028401602052604081208290556123ee8484612ac8565b60606123ee8484600085612ad4565b600061222a8383612bed565b600061222a8383612c05565b606082471015612b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b50565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b8f9190613632565b60006040518083038185875af1925050503d8060008114612bcc576040519150601f19603f3d011682016040523d82523d6000602084013e612bd1565b606091505b5091509150612be287838387612c54565b979650505050505050565b6000818152600183016020526040812054151561222a565b6000818152600183016020526040812054612c4c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b0565b5060006108b0565b60608315612cea578251600003612ce35773ffffffffffffffffffffffffffffffffffffffff85163b612ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b50565b50816123ee565b6123ee8383815115612cff5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509190612f1d565b600060208284031215612d4557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e9457600080fd5b60008083601f840112612de457600080fd5b50813567ffffffffffffffff811115612dfc57600080fd5b602083019150836020828501011115612e1457600080fd5b9250929050565b600080600060408486031215612e3057600080fd5b8335612e3b81612dbc565b9250602084013567ffffffffffffffff811115612e5757600080fd5b612e6386828701612dd2565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e9457600080fd5b600060208284031215612ea457600080fd5b813561222a81612e70565b60005b83811015612eca578181015183820152602001612eb2565b50506000910152565b60008151808452612eeb816020860160208601612eaf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061222a6020830184612ed3565b600060208284031215612f4257600080fd5b813561222a81612dbc565b8315158152606060208201526000612f686060830185612ed3565b8281036040840152612f7a8185612ed3565b9695505050505050565b60008060408385031215612f9757600080fd5b8235612fa281612e70565b946020939093013593505050565b600080600060608486031215612fc557600080fd5b8335612fd081612e70565b92506020840135612fe081612e70565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613043578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613006565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261308860c0840182612ed3565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130c48383612ed3565b925060808601519150808584030160a0860152506130e28282612ff1565b95945050505050565b600080604083850312156130fe57600080fd5b82359150602083013561311081612e70565b809150509250929050565b60008083601f84011261312d57600080fd5b50813567ffffffffffffffff81111561314557600080fd5b6020830191508360208260051b8501011115612e1457600080fd5b6000806000806040858703121561317657600080fd5b843567ffffffffffffffff8082111561318e57600080fd5b61319a8883890161311b565b909650945060208701359150808211156131b357600080fd5b506131c08782880161311b565b95989497509550505050565b6000602082840312156131de57600080fd5b813567ffffffffffffffff8111156131f557600080fd5b820160a0818503121561222a57600080fd5b60008060008060006060868803121561321f57600080fd5b853561322a81612dbc565b9450602086013567ffffffffffffffff8082111561324757600080fd5b61325389838a01612dd2565b9096509450604088013591508082111561326c57600080fd5b5061327988828901612dd2565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132dc576132dc61328a565b60405290565b6040516060810167ffffffffffffffff811182821017156132dc576132dc61328a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561334c5761334c61328a565b604052919050565b600067ffffffffffffffff82111561336e5761336e61328a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133ab57600080fd5b81356133be6133b982613354565b613305565b8181528460208386010111156133d357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561340557600080fd5b833561341081612dbc565b925060208481013567ffffffffffffffff8082111561342e57600080fd5b818701915087601f83011261344257600080fd5b8135818111156134545761345461328a565b613462848260051b01613305565b81815260069190911b8301840190848101908a83111561348157600080fd5b938501935b828510156134cd576040858c03121561349f5760008081fd5b6134a76132b9565b85356134b281612e70565b81528587013587820152825260409094019390850190613486565b9650505060408701359250808311156134e557600080fd5b50506134f38682870161339a565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061352157607f821691505b60208210810361355a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135c357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360257600080fd5b83018035915067ffffffffffffffff82111561361d57600080fd5b602001915036819003821315612e1457600080fd5b600082516135c3818460208701612eaf565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261367957600080fd5b830160208101925035905067ffffffffffffffff81111561369957600080fd5b803603821315612e1457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561304357813561371481612e70565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613701565b60208152813560208201526000602083013561376181612dbc565b67ffffffffffffffff808216604085015261377f6040860186613644565b925060a0606086015261379660c0860184836136a8565b9250506137a66060860186613644565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137dc8583856136a8565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261381557600080fd5b6020928801928301923591508382111561382e57600080fd5b8160061b360383131561384057600080fd5b8685030160a0870152612be28482846136f1565b601f8211156108f5576000816000526020600020601f850160051c8101602086101561387d5750805b601f850160051c820191505b8181101561168e57828155600101613889565b67ffffffffffffffff8311156138b4576138b461328a565b6138c8836138c2835461350d565b83613854565b6000601f84116001811461391a57600085156138e45750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139695786850135825560209485019460019092019101613949565b50868210156139a4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139f081612e70565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a5657613a5661328a565b805483825580841015613ae35760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613a9757613a976139b6565b8086168614613aa857613aa86139b6565b5060008360005260206000208360011b81018760011b820191505b80821015613ade578282558284830155600282019150613ac3565b505050505b5060008181526020812083915b8581101561168e57613b0283836139e5565b6040929092019160029190910190600101613af0565b81358155600181016020830135613b2e81612dbc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b6e60408601866135cd565b93509150613b8083836002870161389c565b613b8d60608601866135cd565b93509150613b9f83836003870161389c565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bd657600080fd5b918401918235915080821115613beb57600080fd5b506020820191508060061b3603821315613c0457600080fd5b612218818360048601613a3d565b600060208284031215613c2457600080fd5b813567ffffffffffffffff80821115613c3c57600080fd5b9083019060608286031215613c5057600080fd5b613c586132e2565b823582811115613c6757600080fd5b613c738782860161339a565b825250602083013582811115613c8857600080fd5b613c948782860161339a565b6020830152506040830135925060028310613cae57600080fd5b6040810192909252509392505050565b60008060408385031215613cd157600080fd5b825167ffffffffffffffff811115613ce857600080fd5b8301601f81018513613cf957600080fd5b8051613d076133b982613354565b818152866020838501011115613d1c57600080fd5b613d2d826020830160208601612eaf565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d6b60e0840182612ed3565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613da78383612ed3565b92506040860151915080858403016080860152613dc48383612ff1565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f7a8282612ed3565b600060208284031215613e1457600080fd5b5051919050565b808201808211156108b0576108b06139b6565b604081526000613e416040830185612ed3565b90508260208301529392505050565b600060208284031215613e6257600080fd5b8151801515811461222a57600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620045603803806200456083398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e88620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bdb01528181611ca401528181611d7c015281816125fc01526126c80152613e886000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b806341eade46116101385780635e35359e116101125780635e35359e146103145780636939cd97146103345780636d62d6331461036157600080fd5b806341eade46146102a65780635075a9d4146102c6578063536c6bfa146102f457600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d3c565b60086020526000908152604090205460ff1681565b6040516101cd9190612d84565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e24565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e9b565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f26565b34801561028357600080fd5b50610297610292366004612f39565b610721565b6040516101cd93929190612f56565b3480156102b257600080fd5b506102266102c1366004612f39565b610858565b3480156102d257600080fd5b506102e66102e1366004612d3c565b6108a3565b6040519081526020016101cd565b34801561030057600080fd5b5061022661030f366004612f8d565b6108b6565b34801561032057600080fd5b5061022661032f366004612fb9565b6108cc565b34801561034057600080fd5b5061035461034f366004612d3c565b6108fa565b6040516101cd9190613057565b34801561036d57600080fd5b5061022661037c3660046130f4565b610b05565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613169565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131d5565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131d5565b6113f8565b3480156104ca57600080fd5b506102266104d9366004613210565b611615565b3480156104ea57600080fd5b506102266104f9366004612d3c565b611696565b6102e661050c3660046133f9565b611900565b34801561051d57600080fd5b5061022661052c366004612e9b565b611e84565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d9085908590613506565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e98565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f1b565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61211b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161074790613516565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613516565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d590613516565b80601f016020809104026020016040519081016040528092919081815260200182805461080190613516565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e98565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b060048361221f565b92915050565b6108be611e98565b6108c88282612232565b5050565b6108d4611e98565b6108f573ffffffffffffffffffffffffffffffffffffffff8416838361238c565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161096990613516565b80601f016020809104026020016040519081016040528092919081815260200182805461099590613516565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081526020016003820180546109fb90613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790613516565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610aa2565b505050915250909392505050565b610b0d611e98565b6001610b1a60048461221f565b14610b59576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b698260025b600491906123e2565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610bb190613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90613516565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b50505050508152602001600382018054610c4390613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613516565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d3f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cea565b5050505081525050905060005b816080015151811015610dce57610dc68383608001518381518110610d7357610d73613569565b60200260200101516020015184608001518481518110610d9557610d95613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661238c9092919063ffffffff16565b600101610d4c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b50565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e98565b60005b818110156110075760026000848484818110610f4557610f45613569565b9050602002810190610f579190613598565b610f65906020810190612f39565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613569565b9050602002810190610fae9190613598565b610fbc9060208101906135d6565b604051610fca929190613506565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613569565b905060200281019061103d9190613598565b61104b906020810190612f39565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613569565b90506020028101906110949190613598565b6110a29060208101906135d6565b6040516110b0929190613506565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b50565b61117e6040820160208301612f39565b61118b60408301836135d6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e9925084915061363b565b9081526040519081900360200190205460ff1661123457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b509190612f26565b6112446040840160208501612f39565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c90613516565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa90889060040161374f565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b5061136586356001610b60565b508535600090815260036020526040902086906113828282613b21565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f26565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135d6565b81019061144d9190613c1b565b905060008160400151600181111561146757611467612d55565b03611475576108c8826123f7565b60018160400151600181111561148d5761148d612d55565b036108c85760008082602001518060200190518101906114ad9190613cc7565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d55565b146115a4576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e98565b67ffffffffffffffff85166000908152600260205260409020600181016116458587836138a5565b50811561165d576002810161165b8385836138a5565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016116a360048361221f565b146116dd576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b6116e8816000610b60565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161173090613516565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90613516565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b505050505081526020016003820180546117c290613516565b80601f01602080910402602001604051908101604052809291908181526020018280546117ee90613516565b801561183b5780601f106118105761010080835404028352916020019161183b565b820191906000526020600020905b81548152906001019060200180831161181e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118be5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611869565b505050508152505090506118d1816127a8565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192c90613516565b1590508061193b5750805460ff165b1561197e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119b190613516565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90613516565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a8990613516565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab590613516565b8015611b025780601f10611ad757610100808354040283529160200191611b02565b820191906000526020600020905b815481529060010190602001808311611ae557829003601f168201915b5050505050815250905060005b8651811015611c6357611b7f3330898481518110611b2f57611b2f613569565b6020026020010151602001518a8581518110611b4d57611b4d613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127b0909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611baf57611baf613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5b57611c5b7f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0c57611c0c613569565b602002602001015160200151898481518110611c2a57611c2a613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661211b9092919063ffffffff16565b600101611b0f565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cdb908b908690600401613d48565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613e0b565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d6257600754611d629073ffffffffffffffffffffffffffffffffffffffff163330846127b0565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611db1576000611db3565b825b8a856040518463ffffffff1660e01b8152600401611dd2929190613d48565b60206040518083038185885af1158015611df0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e159190613e0b565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e8c611e98565b611e958161280e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b50565b565b801580611fbb57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613e0b565b155b612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612903565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190613e0b565b6121c09190613e24565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122199085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612099565b50505050565b600061222b8383612a0f565b9392505050565b8047101561229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122f6576040519150601f19603f3d011682016040523d82523d6000602084013e6122fb565b606091505b50509050806108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612099565b60006123ef848484612a99565b949350505050565b6040805160008082526020820190925281612434565b604080518082019091526000808252602082015281526020019060019003908161240d5790505b50905060006040518060a0016040528084806040019061245491906135d6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124d59288359101613e37565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600291600091612545918901908901612f39565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201805461257590613516565b80601f01602080910402602001604051908101604052809291908181526020018280546125a190613516565b80156125ee5780601f106125c3576101008083540402835291602001916125ee565b820191906000526020600020905b8154815290600101906020018083116125d157829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126499190612f39565b846040518363ffffffff1660e01b8152600401612667929190613d48565b602060405180830381865afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a89190613e0b565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126fd5760006126ff565b835b61270f6040890160208a01612f39565b866040518463ffffffff1660e01b815260040161272d929190613d48565b60206040518083038185885af115801561274b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127709190613e0b565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b611e95611e98565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122199085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612099565b3373ffffffffffffffffffffffffffffffffffffffff82160361288d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b50565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612965826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ab69092919063ffffffff16565b8051909150156108f557808060200190518101906129839190613e59565b6108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b50565b600081815260028301602052604081205480151580612a335750612a338484612ac5565b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b50565b600082815260028401602052604081208290556123ef8484612ad1565b60606123ef8484600085612add565b600061222b8383612bf6565b600061222b8383612c0e565b606082471015612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b50565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b98919061363b565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5091509150612beb87838387612c5d565b979650505050505050565b6000818152600183016020526040812054151561222b565b6000818152600183016020526040812054612c55575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b0565b5060006108b0565b60608315612cf3578251600003612cec5773ffffffffffffffffffffffffffffffffffffffff85163b612cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b50565b50816123ef565b6123ef8383815115612d085781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509190612f26565b600060208284031215612d4e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612dbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e9557600080fd5b60008083601f840112612ded57600080fd5b50813567ffffffffffffffff811115612e0557600080fd5b602083019150836020828501011115612e1d57600080fd5b9250929050565b600080600060408486031215612e3957600080fd5b8335612e4481612dc5565b9250602084013567ffffffffffffffff811115612e6057600080fd5b612e6c86828701612ddb565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e9557600080fd5b600060208284031215612ead57600080fd5b813561222b81612e79565b60005b83811015612ed3578181015183820152602001612ebb565b50506000910152565b60008151808452612ef4816020860160208601612eb8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061222b6020830184612edc565b600060208284031215612f4b57600080fd5b813561222b81612dc5565b8315158152606060208201526000612f716060830185612edc565b8281036040840152612f838185612edc565b9695505050505050565b60008060408385031215612fa057600080fd5b8235612fab81612e79565b946020939093013593505050565b600080600060608486031215612fce57600080fd5b8335612fd981612e79565b92506020840135612fe981612e79565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561304c578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161300f565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261309160c0840182612edc565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130cd8383612edc565b925060808601519150808584030160a0860152506130eb8282612ffa565b95945050505050565b6000806040838503121561310757600080fd5b82359150602083013561311981612e79565b809150509250929050565b60008083601f84011261313657600080fd5b50813567ffffffffffffffff81111561314e57600080fd5b6020830191508360208260051b8501011115612e1d57600080fd5b6000806000806040858703121561317f57600080fd5b843567ffffffffffffffff8082111561319757600080fd5b6131a388838901613124565b909650945060208701359150808211156131bc57600080fd5b506131c987828801613124565b95989497509550505050565b6000602082840312156131e757600080fd5b813567ffffffffffffffff8111156131fe57600080fd5b820160a0818503121561222b57600080fd5b60008060008060006060868803121561322857600080fd5b853561323381612dc5565b9450602086013567ffffffffffffffff8082111561325057600080fd5b61325c89838a01612ddb565b9096509450604088013591508082111561327557600080fd5b5061328288828901612ddb565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132e5576132e5613293565b60405290565b6040516060810167ffffffffffffffff811182821017156132e5576132e5613293565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561335557613355613293565b604052919050565b600067ffffffffffffffff82111561337757613377613293565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133b457600080fd5b81356133c76133c28261335d565b61330e565b8181528460208386010111156133dc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561340e57600080fd5b833561341981612dc5565b925060208481013567ffffffffffffffff8082111561343757600080fd5b818701915087601f83011261344b57600080fd5b81358181111561345d5761345d613293565b61346b848260051b0161330e565b81815260069190911b8301840190848101908a83111561348a57600080fd5b938501935b828510156134d6576040858c0312156134a85760008081fd5b6134b06132c2565b85356134bb81612e79565b8152858701358782015282526040909401939085019061348f565b9650505060408701359250808311156134ee57600080fd5b50506134fc868287016133a3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061352a57607f821691505b602082108103613563577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135cc57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360b57600080fd5b83018035915067ffffffffffffffff82111561362657600080fd5b602001915036819003821315612e1d57600080fd5b600082516135cc818460208701612eb8565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261368257600080fd5b830160208101925035905067ffffffffffffffff8111156136a257600080fd5b803603821315612e1d57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561304c57813561371d81612e79565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161370a565b60208152813560208201526000602083013561376a81612dc5565b67ffffffffffffffff8082166040850152613788604086018661364d565b925060a0606086015261379f60c0860184836136b1565b9250506137af606086018661364d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137e58583856136b1565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261381e57600080fd5b6020928801928301923591508382111561383757600080fd5b8160061b360383131561384957600080fd5b8685030160a0870152612beb8482846136fa565b601f8211156108f5576000816000526020600020601f850160051c810160208610156138865750805b601f850160051c820191505b8181101561168e57828155600101613892565b67ffffffffffffffff8311156138bd576138bd613293565b6138d1836138cb8354613516565b8361385d565b6000601f84116001811461392357600085156138ed5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139725786850135825560209485019460019092019101613952565b50868210156139ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139f981612e79565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a5f57613a5f613293565b805483825580841015613aec5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613aa057613aa06139bf565b8086168614613ab157613ab16139bf565b5060008360005260206000208360011b81018760011b820191505b80821015613ae7578282558284830155600282019150613acc565b505050505b5060008181526020812083915b8581101561168e57613b0b83836139ee565b6040929092019160029190910190600101613af9565b81358155600181016020830135613b3781612dc5565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b7760408601866135d6565b93509150613b898383600287016138a5565b613b9660608601866135d6565b93509150613ba88383600387016138a5565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bdf57600080fd5b918401918235915080821115613bf457600080fd5b506020820191508060061b3603821315613c0d57600080fd5b612219818360048601613a46565b600060208284031215613c2d57600080fd5b813567ffffffffffffffff80821115613c4557600080fd5b9083019060608286031215613c5957600080fd5b613c616132eb565b823582811115613c7057600080fd5b613c7c878286016133a3565b825250602083013582811115613c9157600080fd5b613c9d878286016133a3565b6020830152506040830135925060028310613cb757600080fd5b6040810192909252509392505050565b60008060408385031215613cda57600080fd5b825167ffffffffffffffff811115613cf157600080fd5b8301601f81018513613d0257600080fd5b8051613d106133c28261335d565b818152866020838501011115613d2557600080fd5b613d36826020830160208601612eb8565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d7460e0840182612edc565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613db08383612edc565b92506040860151915080858403016080860152613dcd8383612ffa565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f838282612edc565b600060208284031215613e1d57600080fd5b5051919050565b808201808211156108b0576108b06139bf565b604081526000613e4a6040830185612edc565b90508260208301529392505050565b600060208284031215613e6b57600080fd5b8151801515811461222b57600080fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -321,11 +321,11 @@ func (_CCIPClient *CCIPClientCallerSession) Owner() (common.Address, error) { return _CCIPClient.Contract.Owner(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _CCIPClient.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -340,16 +340,16 @@ func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, arg0 uin } -func (_CCIPClient *CCIPClientSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPClient *CCIPClientSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, arg0) + return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, destChainSelector) } -func (_CCIPClient *CCIPClientCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPClient *CCIPClientCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, arg0) + return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, destChainSelector) } func (_CCIPClient *CCIPClientCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -1965,7 +1965,7 @@ type CCIPClientInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index a7920aa1ff..fd5ede0f3e 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var CCIPReceiverMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002a7e38038062002a7e8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051612881620001fd600039600081816103760152610e5901526128816000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b80635075a9d4116100fc5780635e35359e116100e15780635e35359e146102595780636939cd97146102795780636d62d633146102a657600080fd5b80635075a9d41461020b578063536c6bfa1461023957600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba57806341eade46146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c90565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d53565b3480156101c657600080fd5b506101da6101d5366004611d66565b610465565b60405161016593929190611d83565b3480156101f557600080fd5b50610209610204366004611d66565b61059c565b005b34801561021757600080fd5b5061022b610226366004611dba565b6105e7565b604051908152602001610165565b34801561024557600080fd5b50610209610254366004611df5565b6105fa565b34801561026557600080fd5b50610209610274366004611e21565b610610565b34801561028557600080fd5b50610299610294366004611dba565b61063e565b6040516101659190611e62565b3480156102b257600080fd5b506102096102c1366004611f49565b610849565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fbe565b610c60565b34801561030757600080fd5b5061020961031636600461202a565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b536600461202a565b611074565b3480156103c657600080fd5b506102096103d5366004612065565b611173565b3480156103e657600080fd5b506102096103f5366004611dba565b6111f4565b34801561040657600080fd5b506102096104153660046120e8565b61145d565b67ffffffffffffffff831660009081526002602052604080822090516003909101906104499085908590612105565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b90612115565b80601f01602080910402602001604051908101604052809291908181526020018280546104b790612115565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b50505050509080600201805461051990612115565b80601f016020809104026020016040519081016040528092919081815260200182805461054590612115565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611471565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f46004836114f4565b92915050565b610602611471565b61060c8282611507565b5050565b610618611471565b61063973ffffffffffffffffffffffffffffffffffffffff84168383611661565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ad90612115565b80601f01602080910402602001604051908101604052809291908181526020018280546106d990612115565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050815260200160038201805461073f90612115565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90612115565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107e6565b505050915250909392505050565b610851611471565b600161085e6004846114f4565b1461089d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108ad8260025b600491906116ee565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108f590612115565b80601f016020809104026020016040519081016040528092919081815260200182805461092190612115565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050815260200160038201805461098790612115565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390612115565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a835760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a2e565b5050505081525050905060005b816080015151811015610b1257610b0a8383608001518381518110610ab757610ab7612168565b60200260200101516020015184608001518481518110610ad957610ad9612168565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166116619092919063ffffffff16565b600101610a90565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610894565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611471565b60005b81811015610d4b5760026000848484818110610c8957610c89612168565b9050602002810190610c9b9190612197565b610ca9906020810190611d66565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612168565b9050602002810190610cf29190612197565b610d009060208101906121d5565b604051610d0e929190612105565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612168565b9050602002810190610d819190612197565b610d8f906020810190611d66565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612168565b9050602002810190610dd89190612197565b610de69060208101906121d5565b604051610df4929190612105565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610894565b610ec26040820160208301611d66565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea90612115565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610894565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f78908690600401612347565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016108a4565b508335600090815260036020526040902084906110008282612740565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d53565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d66565b6110ca60408301836121d5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612840565b9081526040519081900360200190205460ff1661063957806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108949190611d53565b61117b611471565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124cc565b5081156111bb57600281016111b98385836124cc565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b6111fc611471565b60016112096004836114f4565b14611243576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610894565b61124e8160006108a4565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161129690612115565b80601f01602080910402602001604051908101604052809291908181526020018280546112c290612115565b801561130f5780601f106112e45761010080835404028352916020019161130f565b820191906000526020600020905b8154815290600101906020018083116112f257829003601f168201915b5050505050815260200160038201805461132890612115565b80601f016020809104026020016040519081016040528092919081815260200182805461135490612115565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156114245760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113cf565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611465611471565b61146e81611703565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610894565b565b600061150083836117f8565b9392505050565b80471015611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610894565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146115cb576040519150601f19603f3d011682016040523d82523d6000602084013e6115d0565b606091505b5050905080610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610894565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610639908490611882565b60006116fb84848461198e565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610894565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061181c575061181c84846119ab565b611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610894565b60006118e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119b79092919063ffffffff16565b80519091501561063957808060200190518101906119029190612852565b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610894565b600082815260028401602052604081208290556116fb84846119c6565b600061150083836119d2565b60606116fb84846000856119ea565b60006115008383611b03565b60008181526001830160205260408120541515611500565b606082471015611a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610894565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aa59190612840565b60006040518083038185875af1925050503d8060008114611ae2576040519150601f19603f3d011682016040523d82523d6000602084013e611ae7565b606091505b5091509150611af887838387611b52565b979650505050505050565b6000818152600183016020526040812054611b4a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f4565b5060006105f4565b60608315611be8578251600003611be15773ffffffffffffffffffffffffffffffffffffffff85163b611be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610894565b50816116fb565b6116fb8383815115611bfd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949190611d53565b67ffffffffffffffff8116811461146e57600080fd5b60008083601f840112611c5957600080fd5b50813567ffffffffffffffff811115611c7157600080fd5b602083019150836020828501011115611c8957600080fd5b9250929050565b600080600060408486031215611ca557600080fd5b8335611cb081611c31565b9250602084013567ffffffffffffffff811115611ccc57600080fd5b611cd886828701611c47565b9497909650939450505050565b60005b83811015611d00578181015183820152602001611ce8565b50506000910152565b60008151808452611d21816020860160208601611ce5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115006020830184611d09565b600060208284031215611d7857600080fd5b813561150081611c31565b8315158152606060208201526000611d9e6060830185611d09565b8281036040840152611db08185611d09565b9695505050505050565b600060208284031215611dcc57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146e57600080fd5b60008060408385031215611e0857600080fd5b8235611e1381611dd3565b946020939093013593505050565b600080600060608486031215611e3657600080fd5b8335611e4181611dd3565b92506020840135611e5181611dd3565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ea060c0860183611d09565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611edc8483611d09565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f3d578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611efe565b50979650505050505050565b60008060408385031215611f5c57600080fd5b823591506020830135611f6e81611dd3565b809150509250929050565b60008083601f840112611f8b57600080fd5b50813567ffffffffffffffff811115611fa357600080fd5b6020830191508360208260051b8501011115611c8957600080fd5b60008060008060408587031215611fd457600080fd5b843567ffffffffffffffff80821115611fec57600080fd5b611ff888838901611f79565b9096509450602087013591508082111561201157600080fd5b5061201e87828801611f79565b95989497509550505050565b60006020828403121561203c57600080fd5b813567ffffffffffffffff81111561205357600080fd5b820160a0818503121561150057600080fd5b60008060008060006060868803121561207d57600080fd5b853561208881611c31565b9450602086013567ffffffffffffffff808211156120a557600080fd5b6120b189838a01611c47565b909650945060408801359150808211156120ca57600080fd5b506120d788828901611c47565b969995985093965092949392505050565b6000602082840312156120fa57600080fd5b813561150081611dd3565b8183823760009101908152919050565b600181811c9082168061212957607f821691505b602082108103612162577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121cb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261220a57600080fd5b83018035915067ffffffffffffffff82111561222557600080fd5b602001915036819003821315611c8957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261226f57600080fd5b830160208101925035905067ffffffffffffffff81111561228f57600080fd5b803603821315611c8957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561233c57813561230a81611dd3565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016122f7565b509495945050505050565b60208152813560208201526000602083013561236281611c31565b67ffffffffffffffff8082166040850152612380604086018661223a565b925060a0606086015261239760c08601848361229e565b9250506123a7606086018661223a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123dd85838561229e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261241657600080fd5b6020928801928301923591508382111561242f57600080fd5b8160061b360383131561244157600080fd5b8685030160a0870152611af88482846122e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610639576000816000526020600020601f850160051c810160208610156124ad5750805b601f850160051c820191505b818110156111ec578281556001016124b9565b67ffffffffffffffff8311156124e4576124e4612455565b6124f8836124f28354612115565b83612484565b6000601f84116001811461254a57600085156125145750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125995786850135825560209485019460019092019101612579565b50868210156125d4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561265381611dd3565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126b9576126b9612455565b80548382558084101561270b576126cf816125e6565b6126d8856125e6565b6000848152602081209283019291909101905b82821015612707578082558060018301556002820191506126eb565b5050505b5060008181526020812083915b858110156111ec5761272a8383612648565b6040929092019160029190910190600101612718565b8135815560018101602083013561275681611c31565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561279660408601866121d5565b935091506127a88383600287016124cc565b6127b560608601866121d5565b935091506127c78383600387016124cc565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126127fe57600080fd5b91840191823591508082111561281357600080fd5b506020820191508060061b360382131561282c57600080fd5b61283a8183600486016126a0565b50505050565b600082516121cb818460208701611ce5565b60006020828403121561286457600080fd5b8151801515811461150057600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002a8738038062002a878339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b60805161288a620001fd600039600081816103760152610e59015261288a6000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b80635075a9d4116100fc5780635e35359e116100e15780635e35359e146102595780636939cd97146102795780636d62d633146102a657600080fd5b80635075a9d41461020b578063536c6bfa1461023957600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba57806341eade46146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c99565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d5c565b3480156101c657600080fd5b506101da6101d5366004611d6f565b610465565b60405161016593929190611d8c565b3480156101f557600080fd5b50610209610204366004611d6f565b61059c565b005b34801561021757600080fd5b5061022b610226366004611dc3565b6105e7565b604051908152602001610165565b34801561024557600080fd5b50610209610254366004611dfe565b6105fa565b34801561026557600080fd5b50610209610274366004611e2a565b610610565b34801561028557600080fd5b50610299610294366004611dc3565b61063e565b6040516101659190611e6b565b3480156102b257600080fd5b506102096102c1366004611f52565b610849565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fc7565b610c60565b34801561030757600080fd5b50610209610316366004612033565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b5366004612033565b611074565b3480156103c657600080fd5b506102096103d536600461206e565b611173565b3480156103e657600080fd5b506102096103f5366004611dc3565b6111f4565b34801561040657600080fd5b506102096104153660046120f1565b61145e565b67ffffffffffffffff83166000908152600260205260408082209051600390910190610449908590859061210e565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b79061211e565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b5050505050908060020180546105199061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546105459061211e565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611472565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f46004836114f5565b92915050565b610602611472565b61060c8282611508565b5050565b610618611472565b61063973ffffffffffffffffffffffffffffffffffffffff84168383611662565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ad9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546106d99061211e565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050815260200160038201805461073f9061211e565b80601f016020809104026020016040519081016040528092919081815260200182805461076b9061211e565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107e6565b505050915250909392505050565b610851611472565b600161085e6004846114f5565b1461089d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108ad8260025b600491906116ef565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108f59061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546109219061211e565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b505050505081526020016003820180546109879061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546109b39061211e565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a835760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a2e565b5050505081525050905060005b816080015151811015610b1257610b0a8383608001518381518110610ab757610ab7612171565b60200260200101516020015184608001518481518110610ad957610ad9612171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166116629092919063ffffffff16565b600101610a90565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610894565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611472565b60005b81811015610d4b5760026000848484818110610c8957610c89612171565b9050602002810190610c9b91906121a0565b610ca9906020810190611d6f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612171565b9050602002810190610cf291906121a0565b610d009060208101906121de565b604051610d0e92919061210e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612171565b9050602002810190610d8191906121a0565b610d8f906020810190611d6f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612171565b9050602002810190610dd891906121a0565b610de69060208101906121de565b604051610df492919061210e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610894565b610ec26040820160208301611d6f565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea9061211e565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610894565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f78908690600401612350565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016108a4565b508335600090815260036020526040902084906110008282612749565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d5c565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d6f565b6110ca60408301836121de565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612849565b9081526040519081900360200190205460ff1661063957806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108949190611d5c565b61117b611472565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124d5565b5081156111bb57600281016111b98385836124d5565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016112016004836114f5565b1461123b576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610894565b6112468160006108a4565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161128e9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba9061211e565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081526020016003820180546113209061211e565b80601f016020809104026020016040519081016040528092919081815260200182805461134c9061211e565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561141c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113c7565b5050505081525050905061142f81611704565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611466611472565b61146f8161170c565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610894565b565b60006115018383611801565b9392505050565b80471015611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610894565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146115cc576040519150601f19603f3d011682016040523d82523d6000602084013e6115d1565b606091505b5050905080610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610894565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261063990849061188b565b60006116fc848484611997565b949350505050565b61146f611472565b3373ffffffffffffffffffffffffffffffffffffffff82160361178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610894565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611825575061182584846119b4565b611501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610894565b60006118ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119c09092919063ffffffff16565b805190915015610639578080602001905181019061190b919061285b565b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610894565b600082815260028401602052604081208290556116fc84846119cf565b600061150183836119db565b60606116fc84846000856119f3565b60006115018383611b0c565b60008181526001830160205260408120541515611501565b606082471015611a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610894565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aae9190612849565b60006040518083038185875af1925050503d8060008114611aeb576040519150601f19603f3d011682016040523d82523d6000602084013e611af0565b606091505b5091509150611b0187838387611b5b565b979650505050505050565b6000818152600183016020526040812054611b53575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f4565b5060006105f4565b60608315611bf1578251600003611bea5773ffffffffffffffffffffffffffffffffffffffff85163b611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610894565b50816116fc565b6116fc8383815115611c065781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949190611d5c565b67ffffffffffffffff8116811461146f57600080fd5b60008083601f840112611c6257600080fd5b50813567ffffffffffffffff811115611c7a57600080fd5b602083019150836020828501011115611c9257600080fd5b9250929050565b600080600060408486031215611cae57600080fd5b8335611cb981611c3a565b9250602084013567ffffffffffffffff811115611cd557600080fd5b611ce186828701611c50565b9497909650939450505050565b60005b83811015611d09578181015183820152602001611cf1565b50506000910152565b60008151808452611d2a816020860160208601611cee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115016020830184611d12565b600060208284031215611d8157600080fd5b813561150181611c3a565b8315158152606060208201526000611da76060830185611d12565b8281036040840152611db98185611d12565b9695505050505050565b600060208284031215611dd557600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146f57600080fd5b60008060408385031215611e1157600080fd5b8235611e1c81611ddc565b946020939093013593505050565b600080600060608486031215611e3f57600080fd5b8335611e4a81611ddc565b92506020840135611e5a81611ddc565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ea960c0860183611d12565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611ee58483611d12565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f46578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611f07565b50979650505050505050565b60008060408385031215611f6557600080fd5b823591506020830135611f7781611ddc565b809150509250929050565b60008083601f840112611f9457600080fd5b50813567ffffffffffffffff811115611fac57600080fd5b6020830191508360208260051b8501011115611c9257600080fd5b60008060008060408587031215611fdd57600080fd5b843567ffffffffffffffff80821115611ff557600080fd5b61200188838901611f82565b9096509450602087013591508082111561201a57600080fd5b5061202787828801611f82565b95989497509550505050565b60006020828403121561204557600080fd5b813567ffffffffffffffff81111561205c57600080fd5b820160a0818503121561150157600080fd5b60008060008060006060868803121561208657600080fd5b853561209181611c3a565b9450602086013567ffffffffffffffff808211156120ae57600080fd5b6120ba89838a01611c50565b909650945060408801359150808211156120d357600080fd5b506120e088828901611c50565b969995985093965092949392505050565b60006020828403121561210357600080fd5b813561150181611ddc565b8183823760009101908152919050565b600181811c9082168061213257607f821691505b60208210810361216b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121d457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261221357600080fd5b83018035915067ffffffffffffffff82111561222e57600080fd5b602001915036819003821315611c9257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261227857600080fd5b830160208101925035905067ffffffffffffffff81111561229857600080fd5b803603821315611c9257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561234557813561231381611ddc565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612300565b509495945050505050565b60208152813560208201526000602083013561236b81611c3a565b67ffffffffffffffff80821660408501526123896040860186612243565b925060a060608601526123a060c0860184836122a7565b9250506123b06060860186612243565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123e68583856122a7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261241f57600080fd5b6020928801928301923591508382111561243857600080fd5b8160061b360383131561244a57600080fd5b8685030160a0870152611b018482846122f0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610639576000816000526020600020601f850160051c810160208610156124b65750805b601f850160051c820191505b818110156111ec578281556001016124c2565b67ffffffffffffffff8311156124ed576124ed61245e565b612501836124fb835461211e565b8361248d565b6000601f841160018114612553576000851561251d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125a25786850135825560209485019460019092019101612582565b50868210156125dd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461264c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561265c81611ddc565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126c2576126c261245e565b805483825580841015612714576126d8816125ef565b6126e1856125ef565b6000848152602081209283019291909101905b82821015612710578082558060018301556002820191506126f4565b5050505b5060008181526020812083915b858110156111ec576127338383612651565b6040929092019160029190910190600101612721565b8135815560018101602083013561275f81611c3a565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561279f60408601866121de565b935091506127b18383600287016124d5565b6127be60608601866121de565b935091506127d08383600387016124d5565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261280757600080fd5b91840191823591508082111561281c57600080fd5b506020820191508060061b360382131561283557600080fd5b6128438183600486016126a9565b50505050565b600082516121d4818460208701611cee565b60006020828403121561286d57600080fd5b8151801515811461150157600080fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -299,11 +299,11 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) Owner() (common.Address, error) return _CCIPReceiver.Contract.Owner(&_CCIPReceiver.CallOpts) } -func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPReceiver.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _CCIPReceiver.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -318,16 +318,16 @@ func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, arg0 } -func (_CCIPReceiver *CCIPReceiverSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPReceiver *CCIPReceiverSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, arg0) + return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, destChainSelector) } -func (_CCIPReceiver *CCIPReceiverCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPReceiver *CCIPReceiverCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, arg0) + return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, destChainSelector) } func (_CCIPReceiver *CCIPReceiverCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -1343,7 +1343,7 @@ type CCIPReceiverInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 8ed77d40ce..c309ab05e4 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -41,7 +41,7 @@ type ClientEVMTokenAmount struct { } var CCIPSenderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", Bin: "0x60a06040523480156200001157600080fd5b506040516200219c3803806200219c8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611f8a620002126000396000818161028401528181610b8d01528181610c5601528181610d2a0152610d660152611f8a6000f3fe6080604052600436106100d65760003560e01c806379ba50971161007f578063b0f479a111610059578063b0f479a114610275578063d8469e40146102a8578063effde240146102c8578063f2fde38b146102e957600080fd5b806379ba5097146101f45780638462a2b9146102095780638da5cb5b1461022957600080fd5b806341eade46116100b057806341eade4614610192578063536c6bfa146101b45780635e35359e146101d457600080fd5b80630e958d6b146100e2578063181f5a771461011757806335f170ef1461016357600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101026100fd3660046116e6565b610309565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d6465760000000000000000000000006020820152905161010e91906117a7565b34801561016f57600080fd5b5061018361017e3660046117c1565b610354565b60405161010e939291906117dc565b34801561019e57600080fd5b506101b26101ad3660046117c1565b61048b565b005b3480156101c057600080fd5b506101b26101cf366004611835565b6104d6565b3480156101e057600080fd5b506101b26101ef36600461186c565b6104ec565b34801561020057600080fd5b506101b261051a565b34801561021557600080fd5b506101b26102243660046118f2565b61061c565b34801561023557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010e565b34801561028157600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610250565b3480156102b457600080fd5b506101b26102c336600461195e565b6107fd565b6102db6102d63660046119df565b61087e565b60405190815260200161010e565b3480156102f557600080fd5b506101b2610304366004611aa0565b610e49565b67ffffffffffffffff831660009081526002602052604080822090516003909101906103389085908590611abd565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161037a90611acd565b80601f01602080910402602001604051908101604052809291908181526020018280546103a690611acd565b80156103f35780601f106103c8576101008083540402835291602001916103f3565b820191906000526020600020905b8154815290600101906020018083116103d657829003601f168201915b50505050509080600201805461040890611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461043490611acd565b80156104815780601f1061045657610100808354040283529160200191610481565b820191906000526020600020905b81548152906001019060200180831161046457829003601f168201915b5050505050905083565b610493610e5d565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6104de610e5d565b6104e88282610ee0565b5050565b6104f4610e5d565b61051573ffffffffffffffffffffffffffffffffffffffff8416838361103a565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610624610e5d565b60005b81811015610707576002600084848481811061064557610645611b20565b90506020028101906106579190611b4f565b6106659060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030183838381811061069c5761069c611b20565b90506020028101906106ae9190611b4f565b6106bc906020810190611b8d565b6040516106ca929190611abd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610627565b5060005b838110156107f65760016002600087878581811061072b5761072b611b20565b905060200281019061073d9190611b4f565b61074b9060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061078257610782611b20565b90506020028101906107949190611b4f565b6107a2906020810190611b8d565b6040516107b0929190611abd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161070b565b5050505050565b610805610e5d565b67ffffffffffffffff851660009081526002602052604090206001810161082d858783611c69565b5081156108455760028101610843838583611c69565b505b805460ff16156108765780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff86166000908152600260205260408120600181018054899291906108aa90611acd565b159050806108b95750805460ff165b156108fc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610597565b6040805160a08101825267ffffffffffffffff8b1660009081526002602052918220600101805482919061092f90611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461095b90611acd565b80156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610a3857610a2960408302860136819003810190611d83565b81526020019060010190610a0c565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600260008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018054610a9390611acd565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90611acd565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b5050505050815250905060005b88811015610c1557610b8833308c8c85818110610b3857610b38611b20565b905060400201602001358d8d86818110610b5457610b54611b20565b610b6a9260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff1692919061110e565b610c0d7f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610bbe57610bbe611b20565b905060400201602001358c8c85818110610bda57610bda611b20565b610bf09260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff169190611172565b600101610b19565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610c8d908e908690600401611ddb565b602060405180830381865afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce9190611ef0565b905073ffffffffffffffffffffffffffffffffffffffff861615610d4f57610d0e73ffffffffffffffffffffffffffffffffffffffff871633308461110e565b610d4f73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000083611172565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615610d9c576000610d9e565b825b8d856040518463ffffffff1660e01b8152600401610dbd929190611ddb565b60206040518083038185885af1158015610ddb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e009190611ef0565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051610e3391815260200190565b60405180910390a1505050509695505050505050565b610e51610e5d565b610e5a81611270565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610597565b565b80471015610f4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610fa4576040519150601f19603f3d011682016040523d82523d6000602084013e610fa9565b606091505b5050905080610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526105159084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611365565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261116c9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161108c565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190611ef0565b6112179190611f09565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061116c9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161108c565b3373ffffffffffffffffffffffffffffffffffffffff8216036112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610597565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006113c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114719092919063ffffffff16565b80519091501561051557808060200190518101906113e59190611f49565b610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610597565b60606114808484600085611488565b949350505050565b60608247101561151a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610597565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115439190611f6b565b60006040518083038185875af1925050503d8060008114611580576040519150601f19603f3d011682016040523d82523d6000602084013e611585565b606091505b5091509150611596878383876115a1565b979650505050505050565b606083156116375782516000036116305773ffffffffffffffffffffffffffffffffffffffff85163b611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b5081611480565b611480838381511561164c5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059791906117a7565b803567ffffffffffffffff8116811461169857600080fd5b919050565b60008083601f8401126116af57600080fd5b50813567ffffffffffffffff8111156116c757600080fd5b6020830191508360208285010111156116df57600080fd5b9250929050565b6000806000604084860312156116fb57600080fd5b61170484611680565b9250602084013567ffffffffffffffff81111561172057600080fd5b61172c8682870161169d565b9497909650939450505050565b60005b8381101561175457818101518382015260200161173c565b50506000910152565b60008151808452611775816020860160208601611739565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ba602083018461175d565b9392505050565b6000602082840312156117d357600080fd5b6117ba82611680565b83151581526060602082015260006117f7606083018561175d565b8281036040840152611809818561175d565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e5a57600080fd5b6000806040838503121561184857600080fd5b823561185381611813565b946020939093013593505050565b803561169881611813565b60008060006060848603121561188157600080fd5b833561188c81611813565b9250602084013561189c81611813565b929592945050506040919091013590565b60008083601f8401126118bf57600080fd5b50813567ffffffffffffffff8111156118d757600080fd5b6020830191508360208260051b85010111156116df57600080fd5b6000806000806040858703121561190857600080fd5b843567ffffffffffffffff8082111561192057600080fd5b61192c888389016118ad565b9096509450602087013591508082111561194557600080fd5b50611952878288016118ad565b95989497509550505050565b60008060008060006060868803121561197657600080fd5b61197f86611680565b9450602086013567ffffffffffffffff8082111561199c57600080fd5b6119a889838a0161169d565b909650945060408801359150808211156119c157600080fd5b506119ce8882890161169d565b969995985093965092949392505050565b600080600080600080608087890312156119f857600080fd5b611a0187611680565b9550602087013567ffffffffffffffff80821115611a1e57600080fd5b818901915089601f830112611a3257600080fd5b813581811115611a4157600080fd5b8a60208260061b8501011115611a5657600080fd5b602083019750809650506040890135915080821115611a7457600080fd5b50611a8189828a0161169d565b9094509250611a94905060608801611861565b90509295509295509295565b600060208284031215611ab257600080fd5b81356117ba81611813565b8183823760009101908152919050565b600181811c90821680611ae157607f821691505b602082108103611b1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611b8357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bc257600080fd5b83018035915067ffffffffffffffff821115611bdd57600080fd5b6020019150368190038213156116df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610515576000816000526020600020601f850160051c81016020861015611c4a5750805b601f850160051c820191505b8181101561087657828155600101611c56565b67ffffffffffffffff831115611c8157611c81611bf2565b611c9583611c8f8354611acd565b83611c21565b6000601f841160018114611ce75760008515611cb15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611d365786850135825560209485019460019092019101611d16565b5086821015611d71577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060408284031215611d9557600080fd5b6040516040810181811067ffffffffffffffff82111715611db857611db8611bf2565b6040528235611dc681611813565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152611e0a60e086018261175d565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152611e45838361175d565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611ea6578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190611e67565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a01529550611ee2818761175d565b9a9950505050505050505050565b600060208284031215611f0257600080fd5b5051919050565b80820180821115611f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600060208284031215611f5b57600080fd5b815180151581146117ba57600080fd5b60008251611b8381846020870161173956fea164736f6c6343000818000a", } @@ -247,11 +247,11 @@ func (_CCIPSender *CCIPSenderCallerSession) Owner() (common.Address, error) { return _CCIPSender.Contract.Owner(&_CCIPSender.CallOpts) } -func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPSender.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _CCIPSender.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -266,16 +266,16 @@ func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, arg0 uin } -func (_CCIPSender *CCIPSenderSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, arg0) + return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, destChainSelector) } -func (_CCIPSender *CCIPSenderCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, arg0) + return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, destChainSelector) } func (_CCIPSender *CCIPSenderCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { @@ -963,7 +963,7 @@ type CCIPSenderInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index cba0ab7ac8..6f043ea949 100644 --- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go +++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620046bf380380620046bf833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613ff1620006ce6000396000818161057e01528181610759015281816107e90152818161137301528181612033015281816120fc01526121d40152613ff16000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f95780635e35359e146104195780636939cd97146104395780636d62d6331461046657600080fd5b80632b6e5d631461032457806335f170ef1461037c57806341eade46146103ab5780635075a9d4146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612ee6565b60086020526000908152604090205460ff1681565b6040516102259190612eff565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612f9f565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e610279366004613016565b61072e565b005b34801561028c57600080fd5b5061027e61029b366004613041565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130cc565b3480156102fb57600080fd5b5061027e61030a3660046130df565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130df565b61097f565b604051610225939291906130fc565b3480156103b757600080fd5b5061027e6103c63660046130df565b610ab6565b3480156103d757600080fd5b506103eb6103e6366004612ee6565b610b01565b604051908152602001610225565b34801561040557600080fd5b5061027e610414366004613133565b610b14565b34801561042557600080fd5b5061027e61043436600461315f565b610b2a565b34801561044557600080fd5b50610459610454366004612ee6565b610b58565b60405161022591906131fd565b34801561047257600080fd5b5061027e61048136600461329a565b610d63565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff36600461330f565b61117a565b34801561051057600080fd5b5061027e61051f36600461337b565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a366004613016565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133b6565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e36600461337b565b611883565b34801561064f57600080fd5b5061027e61065e3660046133e4565b611a70565b34801561066f57600080fd5b5061027e61067e366004612ee6565b611aef565b6103eb61069136600461359c565b611d58565b3480156106a257600080fd5b5061027e6106b1366004613016565b6122dc565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136a9565b9081526040519081900360200190205460ff1690509392505050565b6107366122f0565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612371565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612571565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122f0565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122f0565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122f0565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d6001612675565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136b9565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136b9565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122f0565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b0e600483612782565b92915050565b610b1c6122f0565b610b268282612795565b5050565b610b326122f0565b610b5373ffffffffffffffffffffffffffffffffffffffff841683836128ef565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610bc7906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf3906136b9565b8015610c405780601f10610c1557610100808354040283529160200191610c40565b820191906000526020600020905b815481529060010190602001808311610c2357829003601f168201915b50505050508152602001600382018054610c59906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c85906136b9565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d00565b505050915250909392505050565b610d6b6122f0565b6001610d78600484612782565b14610db7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610dc78260025b60049190612945565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e0f906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906136b9565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b50505050508152602001600382018054610ea1906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906136b9565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f9d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f48565b5050505081525050905060005b81608001515181101561102c576110248383608001518381518110610fd157610fd161370c565b60200260200101516020015184608001518481518110610ff357610ff361370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128ef9092919063ffffffff16565b600101610faa565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610dae565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122f0565b60005b8181101561126557600260008484848181106111a3576111a361370c565b90506020028101906111b5919061373b565b6111c39060208101906130df565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa61370c565b905060200281019061120c919061373b565b61121a906020810190613779565b6040516112289291906136a9565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b83811015611354576001600260008787858181106112895761128961370c565b905060200281019061129b919061373b565b6112a99060208101906130df565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e061370c565b90506020028101906112f2919061373b565b611300906020810190613779565b60405161130e9291906136a9565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dae565b6113dc60408201602083016130df565b6113e96040830183613779565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137de565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b6114a260408401602085016130df565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136b9565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138f2565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610dbe565b508535600090815260036020526040902086906115e08282613cc4565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130cc565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122f0565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610b269082613dbe565b6117186122f0565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137de565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610b539082613dbe565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130df565b6118d96040830183613779565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137de565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b61199260408401602085016130df565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136b9565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6000611a1b6060870187613779565b810190611a289190612ee6565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ed8565b612675565b505050505050565b611a786122f0565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a48565b508115611ab85760028101611ab6838583613a48565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b611af76122f0565b6001611b04600483612782565b14611b3e576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dae565b611b49816000610dbe565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b91906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbd906136b9565b8015611c0a5780601f10611bdf57610100808354040283529160200191611c0a565b820191906000526020600020905b815481529060010190602001808311611bed57829003601f168201915b50505050508152602001600382018054611c23906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f906136b9565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d1f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cca565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d84906136b9565b15905080611d935750805460ff165b15611dd6576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e09906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906136b9565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ee1906136b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0d906136b9565b8015611f5a5780601f10611f2f57610100808354040283529160200191611f5a565b820191906000526020600020905b815481529060010190602001808311611f3d57829003601f168201915b5050505050815250905060005b86518110156120bb57611fd73330898481518110611f8757611f8761370c565b6020026020010151602001518a8581518110611fa557611fa561370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661295a909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106120075761200761370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120b3576120b37f00000000000000000000000000000000000000000000000000000000000000008883815181106120645761206461370c565b6020026020010151602001518984815181106120825761208261370c565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125719092919063ffffffff16565b600101611f67565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90612133908b908690600401613eeb565b602060405180830381865afa158015612150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121749190613fae565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121ba576007546121ba9073ffffffffffffffffffffffffffffffffffffffff1633308461295a565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f991161561220957600061220b565b825b8a856040518463ffffffff1660e01b815260040161222a929190613eeb565b60206040518083038185885af1158015612248573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226d9190613fae565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122e46122f0565b6122ed816129b8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dae565b80158061241157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190613fae565b155b61249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612aad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260c9190613fae565b6126169190613ed8565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061266f9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124ef565b50505050565b806001166001036126b8576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ec565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270191815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610b539267ffffffffffffffff9091169161277b565b60408051808201909152600080825260208201528152602001906001900390816127545790505b5083611d58565b600061278e8383612bb9565b9392505050565b804710156127ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dae565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b5050905080610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124ef565b6000612952848484612c43565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261266f9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124ef565b3373ffffffffffffffffffffffffffffffffffffffff821603612a37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dae565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c609092919063ffffffff16565b805190915015610b535780806020019051810190612b2d9190613fc7565b610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dae565b600081815260028301602052604081205480151580612bdd5750612bdd8484612c6f565b61278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dae565b600082815260028401602052604081208290556129528484612c7b565b60606129528484600085612c87565b600061278e8383612da0565b600061278e8383612db8565b606082471015612d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dae565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d4291906137de565b60006040518083038185875af1925050503d8060008114612d7f576040519150601f19603f3d011682016040523d82523d6000602084013e612d84565b606091505b5091509150612d9587838387612e07565b979650505050505050565b6000818152600183016020526040812054151561278e565b6000818152600183016020526040812054612dff57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0e565b506000610b0e565b60608315612e9d578251600003612e965773ffffffffffffffffffffffffffffffffffffffff85163b612e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dae565b5081612952565b6129528383815115612eb25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae91906130cc565b600060208284031215612ef857600080fd5b5035919050565b6020810160038310612f3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122ed57600080fd5b60008083601f840112612f6857600080fd5b50813567ffffffffffffffff811115612f8057600080fd5b602083019150836020828501011115612f9857600080fd5b9250929050565b600080600060408486031215612fb457600080fd5b8335612fbf81612f40565b9250602084013567ffffffffffffffff811115612fdb57600080fd5b612fe786828701612f56565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122ed57600080fd5b60006020828403121561302857600080fd5b813561278e81612ff4565b80151581146122ed57600080fd5b60006020828403121561305357600080fd5b813561278e81613033565b60005b83811015613079578181015183820152602001613061565b50506000910152565b6000815180845261309a81602086016020860161305e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061278e6020830184613082565b6000602082840312156130f157600080fd5b813561278e81612f40565b83151581526060602082015260006131176060830185613082565b82810360408401526131298185613082565b9695505050505050565b6000806040838503121561314657600080fd5b823561315181612ff4565b946020939093013593505050565b60008060006060848603121561317457600080fd5b833561317f81612ff4565b9250602084013561318f81612ff4565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261323760c0840182613082565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526132738383613082565b925060808601519150808584030160a08601525061329182826131a0565b95945050505050565b600080604083850312156132ad57600080fd5b8235915060208301356132bf81612ff4565b809150509250929050565b60008083601f8401126132dc57600080fd5b50813567ffffffffffffffff8111156132f457600080fd5b6020830191508360208260051b8501011115612f9857600080fd5b6000806000806040858703121561332557600080fd5b843567ffffffffffffffff8082111561333d57600080fd5b613349888389016132ca565b9096509450602087013591508082111561336257600080fd5b5061336f878288016132ca565b95989497509550505050565b60006020828403121561338d57600080fd5b813567ffffffffffffffff8111156133a457600080fd5b820160a0818503121561278e57600080fd5b600080604083850312156133c957600080fd5b82356133d481612f40565b915060208301356132bf81612ff4565b6000806000806000606086880312156133fc57600080fd5b853561340781612f40565b9450602086013567ffffffffffffffff8082111561342457600080fd5b61343089838a01612f56565b9096509450604088013591508082111561344957600080fd5b5061345688828901612f56565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134b9576134b9613467565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561350657613506613467565b604052919050565b600082601f83011261351f57600080fd5b813567ffffffffffffffff81111561353957613539613467565b61356a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134bf565b81815284602083860101111561357f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135b157600080fd5b83356135bc81612f40565b925060208481013567ffffffffffffffff808211156135da57600080fd5b818701915087601f8301126135ee57600080fd5b81358181111561360057613600613467565b61360e848260051b016134bf565b81815260069190911b8301840190848101908a83111561362d57600080fd5b938501935b82851015613679576040858c03121561364b5760008081fd5b613653613496565b853561365e81612ff4565b81528587013587820152825260409094019390850190613632565b96505050604087013592508083111561369157600080fd5b505061369f8682870161350e565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136cd57607f821691505b602082108103613706577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261376f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137ae57600080fd5b83018035915067ffffffffffffffff8211156137c957600080fd5b602001915036819003821315612f9857600080fd5b6000825161376f81846020870161305e565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261382557600080fd5b830160208101925035905067ffffffffffffffff81111561384557600080fd5b803603821315612f9857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131f25781356138c081612ff4565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138ad565b60208152813560208201526000602083013561390d81612f40565b67ffffffffffffffff808216604085015261392b60408601866137f0565b925060a0606086015261394260c086018483613854565b92505061395260608601866137f0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613988858385613854565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139c157600080fd5b602092880192830192359150838211156139da57600080fd5b8160061b36038313156139ec57600080fd5b8685030160a0870152612d9584828461389d565b601f821115610b53576000816000526020600020601f850160051c81016020861015613a295750805b601f850160051c820191505b81811015611a6857828155600101613a35565b67ffffffffffffffff831115613a6057613a60613467565b613a7483613a6e83546136b9565b83613a00565b6000601f841160018114613ac65760008515613a905750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b155786850135825560209485019460019092019101613af5565b5086821015613b50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613b9c81612ff4565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c0257613c02613467565b805483825580841015613c8f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c4357613c43613b62565b8086168614613c5457613c54613b62565b5060008360005260206000208360011b81018760011b820191505b80821015613c8a578282558284830155600282019150613c6f565b505050505b5060008181526020812083915b85811015611a6857613cae8383613b91565b6040929092019160029190910190600101613c9c565b81358155600181016020830135613cda81612f40565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d1a6040860186613779565b93509150613d2c838360028701613a48565b613d396060860186613779565b93509150613d4b838360038701613a48565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d8257600080fd5b918401918235915080821115613d9757600080fd5b506020820191508060061b3603821315613db057600080fd5b61266f818360048601613be9565b815167ffffffffffffffff811115613dd857613dd8613467565b613dec81613de684546136b9565b84613a00565b602080601f831160018114613e3f5760008415613e095750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e8c57888601518255948401946001909101908401613e6d565b5085821015613ec857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610b0e57610b0e613b62565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f1760e0840182613082565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f538383613082565b92506040860151915080858403016080860152613f7083836131a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506131298282613082565b600060208284031215613fc057600080fd5b5051919050565b600060208284031215613fd957600080fd5b815161278e8161303356fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620046c8380380620046c8833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613ffa620006ce6000396000818161057e01528181610759015281816107e90152818161137301528181612034015281816120fd01526121d50152613ffa6000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f95780635e35359e146104195780636939cd97146104395780636d62d6331461046657600080fd5b80632b6e5d631461032457806335f170ef1461037c57806341eade46146103ab5780635075a9d4146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612eef565b60086020526000908152604090205460ff1681565b6040516102259190612f08565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612fa8565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461301f565b61072e565b005b34801561028c57600080fd5b5061027e61029b36600461304a565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130d5565b3480156102fb57600080fd5b5061027e61030a3660046130e8565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130e8565b61097f565b60405161022593929190613105565b3480156103b757600080fd5b5061027e6103c63660046130e8565b610ab6565b3480156103d757600080fd5b506103eb6103e6366004612eef565b610b01565b604051908152602001610225565b34801561040557600080fd5b5061027e61041436600461313c565b610b14565b34801561042557600080fd5b5061027e610434366004613168565b610b2a565b34801561044557600080fd5b50610459610454366004612eef565b610b58565b6040516102259190613206565b34801561047257600080fd5b5061027e6104813660046132a3565b610d63565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff366004613318565b61117a565b34801561051057600080fd5b5061027e61051f366004613384565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a36600461301f565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133bf565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e366004613384565b611883565b34801561064f57600080fd5b5061027e61065e3660046133ed565b611a70565b34801561066f57600080fd5b5061027e61067e366004612eef565b611aef565b6103eb6106913660046135a5565b611d59565b3480156106a257600080fd5b5061027e6106b136600461301f565b6122dd565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136b2565b9081526040519081900360200190205460ff1690509392505050565b6107366122f1565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612372565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612572565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122f1565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122f1565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122f1565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d6001612676565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136c2565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136c2565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122f1565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b0e600483612783565b92915050565b610b1c6122f1565b610b268282612796565b5050565b610b326122f1565b610b5373ffffffffffffffffffffffffffffffffffffffff841683836128f0565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610bc7906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf3906136c2565b8015610c405780601f10610c1557610100808354040283529160200191610c40565b820191906000526020600020905b815481529060010190602001808311610c2357829003601f168201915b50505050508152602001600382018054610c59906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c85906136c2565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d00565b505050915250909392505050565b610d6b6122f1565b6001610d78600484612783565b14610db7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610dc78260025b60049190612946565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e0f906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906136c2565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b50505050508152602001600382018054610ea1906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906136c2565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f9d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f48565b5050505081525050905060005b81608001515181101561102c576110248383608001518381518110610fd157610fd1613715565b60200260200101516020015184608001518481518110610ff357610ff3613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128f09092919063ffffffff16565b600101610faa565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610dae565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122f1565b60005b8181101561126557600260008484848181106111a3576111a3613715565b90506020028101906111b59190613744565b6111c39060208101906130e8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa613715565b905060200281019061120c9190613744565b61121a906020810190613782565b6040516112289291906136b2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b838110156113545760016002600087878581811061128957611289613715565b905060200281019061129b9190613744565b6112a99060208101906130e8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e0613715565b90506020028101906112f29190613744565b611300906020810190613782565b60405161130e9291906136b2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dae565b6113dc60408201602083016130e8565b6113e96040830183613782565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137e7565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b6114a260408401602085016130e8565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136c2565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138fb565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610dbe565b508535600090815260036020526040902086906115e08282613ccd565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130d5565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122f1565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610b269082613dc7565b6117186122f1565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137e7565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610b539082613dc7565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130e8565b6118d96040830183613782565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137e7565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b61199260408401602085016130e8565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136c2565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6000611a1b6060870187613782565b810190611a289190612eef565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ee1565b612676565b505050505050565b611a786122f1565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a51565b508115611ab85760028101611ab6838583613a51565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611afc600483612783565b14611b36576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dae565b611b41816000610dbe565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b89906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb5906136c2565b8015611c025780601f10611bd757610100808354040283529160200191611c02565b820191906000526020600020905b815481529060010190602001808311611be557829003601f168201915b50505050508152602001600382018054611c1b906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c47906136c2565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cc2565b50505050815250509050611d2a8161295b565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d85906136c2565b15905080611d945750805460ff165b15611dd7576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e0a906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e36906136c2565b8015611e835780601f10611e5857610100808354040283529160200191611e83565b820191906000526020600020905b815481529060010190602001808311611e6657829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ee2906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0e906136c2565b8015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050815250905060005b86518110156120bc57611fd83330898481518110611f8857611f88613715565b6020026020010151602001518a8581518110611fa657611fa6613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612963909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061200857612008613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120b4576120b47f000000000000000000000000000000000000000000000000000000000000000088838151811061206557612065613715565b60200260200101516020015189848151811061208357612083613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125729092919063ffffffff16565b600101611f68565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90612134908b908690600401613ef4565b602060405180830381865afa158015612151573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121759190613fb7565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121bb576007546121bb9073ffffffffffffffffffffffffffffffffffffffff16333084612963565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f991161561220a57600061220c565b825b8a856040518463ffffffff1660e01b815260040161222b929190613ef4565b60206040518083038185885af1158015612249573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226e9190613fb7565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122e56122f1565b6122ee816129c1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dae565b80158061241257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190613fb7565b155b61249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612ab6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260d9190613fb7565b6126179190613ee1565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126709085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124f0565b50505050565b806001166001036126b9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ed565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270291815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610b539267ffffffffffffffff9091169161277c565b60408051808201909152600080825260208201528152602001906001900390816127555790505b5083611d59565b600061278f8383612bc2565b9392505050565b80471015612800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dae565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461285a576040519150601f19603f3d011682016040523d82523d6000602084013e61285f565b606091505b5050905080610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124f0565b6000612953848484612c4c565b949350505050565b6122ee6122f1565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126709085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124f0565b3373ffffffffffffffffffffffffffffffffffffffff821603612a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dae565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b18826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c699092919063ffffffff16565b805190915015610b535780806020019051810190612b369190613fd0565b610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dae565b600081815260028301602052604081205480151580612be65750612be68484612c78565b61278f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dae565b600082815260028401602052604081208290556129538484612c84565b60606129538484600085612c90565b600061278f8383612da9565b600061278f8383612dc1565b606082471015612d22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dae565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d4b91906137e7565b60006040518083038185875af1925050503d8060008114612d88576040519150601f19603f3d011682016040523d82523d6000602084013e612d8d565b606091505b5091509150612d9e87838387612e10565b979650505050505050565b6000818152600183016020526040812054151561278f565b6000818152600183016020526040812054612e0857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0e565b506000610b0e565b60608315612ea6578251600003612e9f5773ffffffffffffffffffffffffffffffffffffffff85163b612e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dae565b5081612953565b6129538383815115612ebb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b600060208284031215612f0157600080fd5b5035919050565b6020810160038310612f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122ee57600080fd5b60008083601f840112612f7157600080fd5b50813567ffffffffffffffff811115612f8957600080fd5b602083019150836020828501011115612fa157600080fd5b9250929050565b600080600060408486031215612fbd57600080fd5b8335612fc881612f49565b9250602084013567ffffffffffffffff811115612fe457600080fd5b612ff086828701612f5f565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122ee57600080fd5b60006020828403121561303157600080fd5b813561278f81612ffd565b80151581146122ee57600080fd5b60006020828403121561305c57600080fd5b813561278f8161303c565b60005b8381101561308257818101518382015260200161306a565b50506000910152565b600081518084526130a3816020860160208601613067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061278f602083018461308b565b6000602082840312156130fa57600080fd5b813561278f81612f49565b8315158152606060208201526000613120606083018561308b565b8281036040840152613132818561308b565b9695505050505050565b6000806040838503121561314f57600080fd5b823561315a81612ffd565b946020939093013593505050565b60008060006060848603121561317d57600080fd5b833561318881612ffd565b9250602084013561319881612ffd565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131fb578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131be565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261324060c084018261308b565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261327c838361308b565b925060808601519150808584030160a08601525061329a82826131a9565b95945050505050565b600080604083850312156132b657600080fd5b8235915060208301356132c881612ffd565b809150509250929050565b60008083601f8401126132e557600080fd5b50813567ffffffffffffffff8111156132fd57600080fd5b6020830191508360208260051b8501011115612fa157600080fd5b6000806000806040858703121561332e57600080fd5b843567ffffffffffffffff8082111561334657600080fd5b613352888389016132d3565b9096509450602087013591508082111561336b57600080fd5b50613378878288016132d3565b95989497509550505050565b60006020828403121561339657600080fd5b813567ffffffffffffffff8111156133ad57600080fd5b820160a0818503121561278f57600080fd5b600080604083850312156133d257600080fd5b82356133dd81612f49565b915060208301356132c881612ffd565b60008060008060006060868803121561340557600080fd5b853561341081612f49565b9450602086013567ffffffffffffffff8082111561342d57600080fd5b61343989838a01612f5f565b9096509450604088013591508082111561345257600080fd5b5061345f88828901612f5f565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134c2576134c2613470565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561350f5761350f613470565b604052919050565b600082601f83011261352857600080fd5b813567ffffffffffffffff81111561354257613542613470565b61357360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134c8565b81815284602083860101111561358857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135ba57600080fd5b83356135c581612f49565b925060208481013567ffffffffffffffff808211156135e357600080fd5b818701915087601f8301126135f757600080fd5b81358181111561360957613609613470565b613617848260051b016134c8565b81815260069190911b8301840190848101908a83111561363657600080fd5b938501935b82851015613682576040858c0312156136545760008081fd5b61365c61349f565b853561366781612ffd565b8152858701358782015282526040909401939085019061363b565b96505050604087013592508083111561369a57600080fd5b50506136a886828701613517565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136d657607f821691505b60208210810361370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261377857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b757600080fd5b83018035915067ffffffffffffffff8211156137d257600080fd5b602001915036819003821315612fa157600080fd5b60008251613778818460208701613067565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261382e57600080fd5b830160208101925035905067ffffffffffffffff81111561384e57600080fd5b803603821315612fa157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131fb5781356138c981612ffd565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138b6565b60208152813560208201526000602083013561391681612f49565b67ffffffffffffffff808216604085015261393460408601866137f9565b925060a0606086015261394b60c08601848361385d565b92505061395b60608601866137f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261399185838561385d565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139ca57600080fd5b602092880192830192359150838211156139e357600080fd5b8160061b36038313156139f557600080fd5b8685030160a0870152612d9e8482846138a6565b601f821115610b53576000816000526020600020601f850160051c81016020861015613a325750805b601f850160051c820191505b81811015611a6857828155600101613a3e565b67ffffffffffffffff831115613a6957613a69613470565b613a7d83613a7783546136c2565b83613a09565b6000601f841160018114613acf5760008515613a995750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b1e5786850135825560209485019460019092019101613afe565b5086821015613b59577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613ba581612ffd565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c0b57613c0b613470565b805483825580841015613c985760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c4c57613c4c613b6b565b8086168614613c5d57613c5d613b6b565b5060008360005260206000208360011b81018760011b820191505b80821015613c93578282558284830155600282019150613c78565b505050505b5060008181526020812083915b85811015611a6857613cb78383613b9a565b6040929092019160029190910190600101613ca5565b81358155600181016020830135613ce381612f49565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d236040860186613782565b93509150613d35838360028701613a51565b613d426060860186613782565b93509150613d54838360038701613a51565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d8b57600080fd5b918401918235915080821115613da057600080fd5b506020820191508060061b3603821315613db957600080fd5b612670818360048601613bf2565b815167ffffffffffffffff811115613de157613de1613470565b613df581613def84546136c2565b84613a09565b602080601f831160018114613e485760008415613e125750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e9557888601518255948401946001909101908401613e76565b5085821015613ed157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610b0e57610b0e613b6b565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f2060e084018261308b565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f5c838361308b565b92506040860151915080858403016080860152613f7983836131a9565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613132828261308b565b600060208284031215613fc957600080fd5b5051919050565b600060208284031215613fe257600080fd5b815161278f8161303c56fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -387,11 +387,11 @@ func (_PingPongDemo *PingPongDemoCallerSession) Owner() (common.Address, error) return _PingPongDemo.Contract.Owner(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _PingPongDemo.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -406,16 +406,16 @@ func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, arg0 } -func (_PingPongDemo *PingPongDemoSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_PingPongDemo *PingPongDemoSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, arg0) + return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, destChainSelector) } -func (_PingPongDemo *PingPongDemoCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_PingPongDemo *PingPongDemoCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, arg0) + return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, destChainSelector) } func (_PingPongDemo *PingPongDemoCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -2343,7 +2343,7 @@ type PingPongDemoInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go index 19865a5b71..eb5448c4b5 100644 --- a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go +++ b/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go @@ -49,8 +49,8 @@ type ClientEVMTokenAmount struct { } var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004c3b38038062004c3b833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144e762000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122e5015281816123ae015281816124860152612b7801526144e76000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ae5780636fef519e146104ce57806379ba50971461051757600080fd5b80635e35359e146104615780636939cd971461048157600080fd5b806335f170ef146103c457806341eade46146103f35780635075a9d414610413578063536c6bfa1461044157600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613361565b60086020526000908152604090205460ff1681565b604051610266919061337a565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461341a565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613491565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134bc565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613547565b34801561034357600080fd5b506102bf61035236600461355a565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df36600461355a565b610a4d565b60405161026693929190613577565b3480156103ff57600080fd5b506102bf61040e36600461355a565b610b84565b34801561041f57600080fd5b5061043361042e366004613361565b610bcf565b604051908152602001610266565b34801561044d57600080fd5b506102bf61045c3660046135ae565b610be2565b34801561046d57600080fd5b506102bf61047c3660046135da565b610bf8565b34801561048d57600080fd5b506104a161049c366004613361565b610c26565b6040516102669190613678565b3480156104ba57600080fd5b506102bf6104c9366004613715565b610e31565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf61054736600461378a565b611248565b34801561055857600080fd5b506102bf6105673660046137f6565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b2366004613361565b611724565b3480156105c357600080fd5b506102bf6105d2366004613491565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d366004613831565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137f6565b611b35565b3480156106b757600080fd5b506102bf6106c636600461385f565b611d22565b3480156106d757600080fd5b506102bf6106e6366004613361565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61043361073f366004613a17565b61200a565b34801561075057600080fd5b506102bf61075f366004613b24565b61258e565b34801561077057600080fd5b506102bf61077f366004613491565b61261f565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b47565b9081526040519081900360200190205460ff1690509392505050565b610804612630565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126b1565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128b1565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612630565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612630565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612630565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129b5565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b57565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b57565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612630565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bdc600483612bfd565b92915050565b610bea612630565b610bf48282612c10565b5050565b610c00612630565b610c2173ffffffffffffffffffffffffffffffffffffffff84168383612d6a565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c9590613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613b57565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b50505050508152602001600382018054610d2790613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5390613b57565b8015610da05780601f10610d7557610100808354040283529160200191610da0565b820191906000526020600020905b815481529060010190602001808311610d8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dce565b505050915250909392505050565b610e39612630565b6001610e46600484612bfd565b14610e85576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e958260025b60049190612dc0565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610edd90613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613b57565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b50505050508152602001600382018054610f6f90613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613b57565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611016565b5050505081525050905060005b8160800151518110156110fa576110f2838360800151838151811061109f5761109f613baa565b602002602001015160200151846080015184815181106110c1576110c1613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6a9092919063ffffffff16565b600101611078565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e7c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612630565b60005b81811015611333576002600084848481811061127157611271613baa565b90506020028101906112839190613bd9565b61129190602081019061355a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613baa565b90506020028101906112da9190613bd9565b6112e8906020810190613c17565b6040516112f6929190613b47565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613baa565b90506020028101906113699190613bd9565b61137790602081019061355a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613baa565b90506020028101906113c09190613bd9565b6113ce906020810190613c17565b6040516113dc929190613b47565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e7c565b6114aa604082016020830161355a565b6114b76040830183613c17565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c7c565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b611570604084016020850161355a565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b57565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d90565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610e8c565b508535600090815260036020526040902086906116ae8282614162565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e3908490613547565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff168361425c565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c9190614297565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612630565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610bf490826142b4565b6119ca612630565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c7c565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610c2190826142b4565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e604082016020830161355a565b611b8b6040830183613c17565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c7c565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b611c44604084016020850161355a565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b57565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6000611ccd6060870187613c17565b810190611cda9190613361565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143ce565b6129b5565b505050505050565b611d2a612630565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613ee6565b508115611d6a5760028101611d68838583613ee6565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b611da9612630565b6001611db6600483612bfd565b14611df0576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e7c565b611dfb816000610e8c565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e4390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6f90613b57565b8015611ebc5780601f10611e9157610100808354040283529160200191611ebc565b820191906000526020600020905b815481529060010190602001808311611e9f57829003601f168201915b50505050508152602001600382018054611ed590613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0190613b57565b8015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fd15760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f7c565b5050505081525050905060405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061203690613b57565b159050806120455750805460ff165b15612088576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120bb90613b57565b80601f01602080910402602001604051908101604052809291908181526020018280546120e790613b57565b80156121345780601f1061210957610100808354040283529160200191612134565b820191906000526020600020905b81548152906001019060200180831161211757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161219390613b57565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf90613b57565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b5050505050815250905060005b865181101561236d57612289333089848151811061223957612239613baa565b6020026020010151602001518a858151811061225757612257613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dd5909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122b9576122b9613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614612365576123657f000000000000000000000000000000000000000000000000000000000000000088838151811061231657612316613baa565b60200260200101516020015189848151811061233457612334613baa565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128b19092919063ffffffff16565b600101612219565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123e5908b9086906004016143e1565b602060405180830381865afa158015612402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242691906144a4565b60075490915073ffffffffffffffffffffffffffffffffffffffff161561246c5760075461246c9073ffffffffffffffffffffffffffffffffffffffff16333084612dd5565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124bb5760006124bd565b825b8a856040518463ffffffff1660e01b81526004016124dc9291906143e1565b60206040518083038185885af11580156124fa573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251f91906144a4565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612596612630565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612627612630565b61190581612e33565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e7c565b80158061275157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561272b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274f91906144a4565b155b6127dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f28565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294c91906144a4565b61295691906143ce565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129af9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161282f565b50505050565b806001166001036129f8576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a2c565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a3581611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9991815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b1357816020015b6040805180820190915260008082526020820152815260200190600190039081612aec5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bba9167ffffffffffffffff9091169085906004016143e1565b6020604051808303816000875af1158015612bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2191906144a4565b6000612c098383613034565b9392505050565b80471015612c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e7c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd4576040519150601f19603f3d011682016040523d82523d6000602084013e612cd9565b606091505b5050905080610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161282f565b6000612dcd8484846130be565b949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129af9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161282f565b3373ffffffffffffffffffffffffffffffffffffffff821603612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e7c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f8a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130db9092919063ffffffff16565b805190915015610c215780806020019051810190612fa891906144bd565b610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e7c565b600081815260028301602052604081205480151580613058575061305884846130ea565b612c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e7c565b60008281526002840160205260408120829055612dcd84846130f6565b6060612dcd8484600085613102565b6000612c09838361321b565b6000612c098383613233565b606082471015613194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e7c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131bd9190613c7c565b60006040518083038185875af1925050503d80600081146131fa576040519150601f19603f3d011682016040523d82523d6000602084013e6131ff565b606091505b509150915061321087838387613282565b979650505050505050565b60008181526001830160205260408120541515612c09565b600081815260018301602052604081205461327a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b606083156133185782516000036133115773ffffffffffffffffffffffffffffffffffffffff85163b613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e7c565b5081612dcd565b612dcd838381511561332d5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c9190613547565b60006020828403121561337357600080fd5b5035919050565b60208101600383106133b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133e357600080fd5b50813567ffffffffffffffff8111156133fb57600080fd5b60208301915083602082850101111561341357600080fd5b9250929050565b60008060006040848603121561342f57600080fd5b833561343a816133bb565b9250602084013567ffffffffffffffff81111561345657600080fd5b613462868287016133d1565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b6000602082840312156134a357600080fd5b8135612c098161346f565b801515811461190557600080fd5b6000602082840312156134ce57600080fd5b8135612c09816134ae565b60005b838110156134f45781810151838201526020016134dc565b50506000910152565b600081518084526135158160208601602086016134d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0960208301846134fd565b60006020828403121561356c57600080fd5b8135612c09816133bb565b831515815260606020820152600061359260608301856134fd565b82810360408401526135a481856134fd565b9695505050505050565b600080604083850312156135c157600080fd5b82356135cc8161346f565b946020939093013593505050565b6000806000606084860312156135ef57600080fd5b83356135fa8161346f565b9250602084013561360a8161346f565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561366d578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613630565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136b260c08401826134fd565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136ee83836134fd565b925060808601519150808584030160a08601525061370c828261361b565b95945050505050565b6000806040838503121561372857600080fd5b82359150602083013561373a8161346f565b809150509250929050565b60008083601f84011261375757600080fd5b50813567ffffffffffffffff81111561376f57600080fd5b6020830191508360208260051b850101111561341357600080fd5b600080600080604085870312156137a057600080fd5b843567ffffffffffffffff808211156137b857600080fd5b6137c488838901613745565b909650945060208701359150808211156137dd57600080fd5b506137ea87828801613745565b95989497509550505050565b60006020828403121561380857600080fd5b813567ffffffffffffffff81111561381f57600080fd5b820160a08185031215612c0957600080fd5b6000806040838503121561384457600080fd5b823561384f816133bb565b9150602083013561373a8161346f565b60008060008060006060868803121561387757600080fd5b8535613882816133bb565b9450602086013567ffffffffffffffff8082111561389f57600080fd5b6138ab89838a016133d1565b909650945060408801359150808211156138c457600080fd5b506138d1888289016133d1565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613934576139346138e2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613981576139816138e2565b604052919050565b600082601f83011261399a57600080fd5b813567ffffffffffffffff8111156139b4576139b46138e2565b6139e560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161393a565b8181528460208386010111156139fa57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a2c57600080fd5b8335613a37816133bb565b925060208481013567ffffffffffffffff80821115613a5557600080fd5b818701915087601f830112613a6957600080fd5b813581811115613a7b57613a7b6138e2565b613a89848260051b0161393a565b81815260069190911b8301840190848101908a831115613aa857600080fd5b938501935b82851015613af4576040858c031215613ac65760008081fd5b613ace613911565b8535613ad98161346f565b81528587013587820152825260409094019390850190613aad565b965050506040870135925080831115613b0c57600080fd5b5050613b1a86828701613989565b9150509250925092565b600060208284031215613b3657600080fd5b813560ff81168114612c0957600080fd5b8183823760009101908152919050565b600181811c90821680613b6b57607f821691505b602082108103613ba4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c0d57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c4c57600080fd5b83018035915067ffffffffffffffff821115613c6757600080fd5b60200191503681900382131561341357600080fd5b60008251613c0d8184602087016134d9565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cc357600080fd5b830160208101925035905067ffffffffffffffff811115613ce357600080fd5b80360382131561341357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561366d578135613d5e8161346f565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d4b565b602081528135602082015260006020830135613dab816133bb565b67ffffffffffffffff8082166040850152613dc96040860186613c8e565b925060a06060860152613de060c086018483613cf2565b925050613df06060860186613c8e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e26858385613cf2565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e5f57600080fd5b60209288019283019235915083821115613e7857600080fd5b8160061b3603831315613e8a57600080fd5b8685030160a0870152613210848284613d3b565b601f821115610c21576000816000526020600020601f850160051c81016020861015613ec75750805b601f850160051c820191505b81811015611d1a57828155600101613ed3565b67ffffffffffffffff831115613efe57613efe6138e2565b613f1283613f0c8354613b57565b83613e9e565b6000601f841160018114613f645760008515613f2e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fb35786850135825560209485019460019092019101613f93565b5086821015613fee577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561403a8161346f565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140a0576140a06138e2565b80548382558084101561412d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140e1576140e1614000565b80861686146140f2576140f2614000565b5060008360005260206000208360011b81018760011b820191505b8082101561412857828255828483015560028201915061410d565b505050505b5060008181526020812083915b85811015611d1a5761414c838361402f565b604092909201916002919091019060010161413a565b81358155600181016020830135614178816133bb565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141b86040860186613c17565b935091506141ca838360028701613ee6565b6141d76060860186613c17565b935091506141e9838360038701613ee6565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261422057600080fd5b91840191823591508082111561423557600080fd5b506020820191508060061b360382131561424e57600080fd5b6129af818360048601614087565b600082614292577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142a957600080fd5b8151612c098161346f565b815167ffffffffffffffff8111156142ce576142ce6138e2565b6142e2816142dc8454613b57565b84613e9e565b602080601f83116001811461433557600084156142ff5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561438257888601518255948401946001909101908401614363565b50858210156143be57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610bdc57610bdc614000565b67ffffffffffffffff83168152604060208201526000825160a0604084015261440d60e08401826134fd565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261444983836134fd565b92506040860151915080858403016080860152614466838361361b565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506135a482826134fd565b6000602082840312156144b657600080fd5b5051919050565b6000602082840312156144cf57600080fd5b8151612c09816134ae56fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162004c4438038062004c44833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144f062000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122e6015281816123af015281816124870152612b7901526144f06000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ae5780636fef519e146104ce57806379ba50971461051757600080fd5b80635e35359e146104615780636939cd971461048157600080fd5b806335f170ef146103c457806341eade46146103f35780635075a9d414610413578063536c6bfa1461044157600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b5061025961024436600461336a565b60086020526000908152604090205460ff1681565b6040516102669190613383565b60405180910390f35b34801561027b57600080fd5b5061028f61028a366004613423565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba36600461349a565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134c5565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613550565b34801561034357600080fd5b506102bf610352366004613563565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613563565b610a4d565b60405161026693929190613580565b3480156103ff57600080fd5b506102bf61040e366004613563565b610b84565b34801561041f57600080fd5b5061043361042e36600461336a565b610bcf565b604051908152602001610266565b34801561044d57600080fd5b506102bf61045c3660046135b7565b610be2565b34801561046d57600080fd5b506102bf61047c3660046135e3565b610bf8565b34801561048d57600080fd5b506104a161049c36600461336a565b610c26565b6040516102669190613681565b3480156104ba57600080fd5b506102bf6104c936600461371e565b610e31565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf610547366004613793565b611248565b34801561055857600080fd5b506102bf6105673660046137ff565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b236600461336a565b611724565b3480156105c357600080fd5b506102bf6105d236600461349a565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d36600461383a565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137ff565b611b35565b3480156106b757600080fd5b506102bf6106c6366004613868565b611d22565b3480156106d757600080fd5b506102bf6106e636600461336a565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61043361073f366004613a20565b61200b565b34801561075057600080fd5b506102bf61075f366004613b2d565b61258f565b34801561077057600080fd5b506102bf61077f36600461349a565b612620565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b50565b9081526040519081900360200190205460ff1690509392505050565b610804612631565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126b2565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128b2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612631565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612631565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612631565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129b6565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b60565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b60565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612631565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bdc600483612bfe565b92915050565b610bea612631565b610bf48282612c11565b5050565b610c00612631565b610c2173ffffffffffffffffffffffffffffffffffffffff84168383612d6b565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c9590613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613b60565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b50505050508152602001600382018054610d2790613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5390613b60565b8015610da05780601f10610d7557610100808354040283529160200191610da0565b820191906000526020600020905b815481529060010190602001808311610d8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dce565b505050915250909392505050565b610e39612631565b6001610e46600484612bfe565b14610e85576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e958260025b60049190612dc1565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610edd90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613b60565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b50505050508152602001600382018054610f6f90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613b60565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611016565b5050505081525050905060005b8160800151518110156110fa576110f2838360800151838151811061109f5761109f613bb3565b602002602001015160200151846080015184815181106110c1576110c1613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6b9092919063ffffffff16565b600101611078565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e7c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612631565b60005b81811015611333576002600084848481811061127157611271613bb3565b90506020028101906112839190613be2565b611291906020810190613563565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613bb3565b90506020028101906112da9190613be2565b6112e8906020810190613c20565b6040516112f6929190613b50565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613bb3565b90506020028101906113699190613be2565b611377906020810190613563565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613bb3565b90506020028101906113c09190613be2565b6113ce906020810190613c20565b6040516113dc929190613b50565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e7c565b6114aa6040820160208301613563565b6114b76040830183613c20565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c85565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b6115706040840160208501613563565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b60565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d99565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610e8c565b508535600090815260036020526040902086906116ae828261416b565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e3908490613550565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff1683614265565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c91906142a0565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612631565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610bf490826142bd565b6119ca612631565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c85565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610c2190826142bd565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e6040820160208301613563565b611b8b6040830183613c20565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c85565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b611c446040840160208501613563565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b60565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6000611ccd6060870187613c20565b810190611cda919061336a565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143d7565b6129b6565b505050505050565b611d2a612631565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613eef565b508115611d6a5760028101611d68838583613eef565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611dae600483612bfe565b14611de8576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e7c565b611df3816000610e8c565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e3b90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6790613b60565b8015611eb45780601f10611e8957610100808354040283529160200191611eb4565b820191906000526020600020905b815481529060010190602001808311611e9757829003601f168201915b50505050508152602001600382018054611ecd90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990613b60565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fc95760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f74565b50505050815250509050611fdc81612dd6565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061203790613b60565b159050806120465750805460ff165b15612089576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120bc90613b60565b80601f01602080910402602001604051908101604052809291908181526020018280546120e890613b60565b80156121355780601f1061210a57610100808354040283529160200191612135565b820191906000526020600020905b81548152906001019060200180831161211857829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161219490613b60565b80601f01602080910402602001604051908101604052809291908181526020018280546121c090613b60565b801561220d5780601f106121e25761010080835404028352916020019161220d565b820191906000526020600020905b8154815290600101906020018083116121f057829003601f168201915b5050505050815250905060005b865181101561236e5761228a333089848151811061223a5761223a613bb3565b6020026020010151602001518a858151811061225857612258613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dde909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122ba576122ba613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614612366576123667f000000000000000000000000000000000000000000000000000000000000000088838151811061231757612317613bb3565b60200260200101516020015189848151811061233557612335613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128b29092919063ffffffff16565b60010161221a565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123e6908b9086906004016143ea565b602060405180830381865afa158015612403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242791906144ad565b60075490915073ffffffffffffffffffffffffffffffffffffffff161561246d5760075461246d9073ffffffffffffffffffffffffffffffffffffffff16333084612dde565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124bc5760006124be565b825b8a856040518463ffffffff1660e01b81526004016124dd9291906143ea565b60206040518083038185885af11580156124fb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061252091906144ad565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612597612631565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612628612631565b61190581612e3c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e7c565b80158061275257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275091906144ad565b155b6127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f31565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d91906144ad565b61295791906143d7565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129b09085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612830565b50505050565b806001166001036129f9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a2d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a3681611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b1457816020015b6040805180820190915260008082526020820152815260200190600190039081612aed5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bbb9167ffffffffffffffff9091169085906004016143ea565b6020604051808303816000875af1158015612bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2191906144ad565b6000612c0a838361303d565b9392505050565b80471015612c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e7c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd5576040519150601f19603f3d011682016040523d82523d6000602084013e612cda565b606091505b5050905080610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612830565b6000612dce8484846130c7565b949350505050565b611905612631565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129b09085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612830565b3373ffffffffffffffffffffffffffffffffffffffff821603612ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e7c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f93826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130e49092919063ffffffff16565b805190915015610c215780806020019051810190612fb191906144c6565b610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e7c565b600081815260028301602052604081205480151580613061575061306184846130f3565b612c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e7c565b60008281526002840160205260408120829055612dce84846130ff565b6060612dce848460008561310b565b6000612c0a8383613224565b6000612c0a838361323c565b60608247101561319d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e7c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131c69190613c85565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50915091506132198783838761328b565b979650505050505050565b60008181526001830160205260408120541515612c0a565b600081815260018301602052604081205461328357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b6060831561332157825160000361331a5773ffffffffffffffffffffffffffffffffffffffff85163b61331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e7c565b5081612dce565b612dce83838151156133365781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b60006020828403121561337c57600080fd5b5035919050565b60208101600383106133be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133ec57600080fd5b50813567ffffffffffffffff81111561340457600080fd5b60208301915083602082850101111561341c57600080fd5b9250929050565b60008060006040848603121561343857600080fd5b8335613443816133c4565b9250602084013567ffffffffffffffff81111561345f57600080fd5b61346b868287016133da565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b6000602082840312156134ac57600080fd5b8135612c0a81613478565b801515811461190557600080fd5b6000602082840312156134d757600080fd5b8135612c0a816134b7565b60005b838110156134fd5781810151838201526020016134e5565b50506000910152565b6000815180845261351e8160208601602086016134e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0a6020830184613506565b60006020828403121561357557600080fd5b8135612c0a816133c4565b831515815260606020820152600061359b6060830185613506565b82810360408401526135ad8185613506565b9695505050505050565b600080604083850312156135ca57600080fd5b82356135d581613478565b946020939093013593505050565b6000806000606084860312156135f857600080fd5b833561360381613478565b9250602084013561361381613478565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613676578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613639565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136bb60c0840182613506565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136f78383613506565b925060808601519150808584030160a0860152506137158282613624565b95945050505050565b6000806040838503121561373157600080fd5b82359150602083013561374381613478565b809150509250929050565b60008083601f84011261376057600080fd5b50813567ffffffffffffffff81111561377857600080fd5b6020830191508360208260051b850101111561341c57600080fd5b600080600080604085870312156137a957600080fd5b843567ffffffffffffffff808211156137c157600080fd5b6137cd8883890161374e565b909650945060208701359150808211156137e657600080fd5b506137f38782880161374e565b95989497509550505050565b60006020828403121561381157600080fd5b813567ffffffffffffffff81111561382857600080fd5b820160a08185031215612c0a57600080fd5b6000806040838503121561384d57600080fd5b8235613858816133c4565b9150602083013561374381613478565b60008060008060006060868803121561388057600080fd5b853561388b816133c4565b9450602086013567ffffffffffffffff808211156138a857600080fd5b6138b489838a016133da565b909650945060408801359150808211156138cd57600080fd5b506138da888289016133da565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561393d5761393d6138eb565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561398a5761398a6138eb565b604052919050565b600082601f8301126139a357600080fd5b813567ffffffffffffffff8111156139bd576139bd6138eb565b6139ee60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613943565b818152846020838601011115613a0357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a3557600080fd5b8335613a40816133c4565b925060208481013567ffffffffffffffff80821115613a5e57600080fd5b818701915087601f830112613a7257600080fd5b813581811115613a8457613a846138eb565b613a92848260051b01613943565b81815260069190911b8301840190848101908a831115613ab157600080fd5b938501935b82851015613afd576040858c031215613acf5760008081fd5b613ad761391a565b8535613ae281613478565b81528587013587820152825260409094019390850190613ab6565b965050506040870135925080831115613b1557600080fd5b5050613b2386828701613992565b9150509250925092565b600060208284031215613b3f57600080fd5b813560ff81168114612c0a57600080fd5b8183823760009101908152919050565b600181811c90821680613b7457607f821691505b602082108103613bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c1657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5557600080fd5b83018035915067ffffffffffffffff821115613c7057600080fd5b60200191503681900382131561341c57600080fd5b60008251613c168184602087016134e2565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ccc57600080fd5b830160208101925035905067ffffffffffffffff811115613cec57600080fd5b80360382131561341c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613676578135613d6781613478565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d54565b602081528135602082015260006020830135613db4816133c4565b67ffffffffffffffff8082166040850152613dd26040860186613c97565b925060a06060860152613de960c086018483613cfb565b925050613df96060860186613c97565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e2f858385613cfb565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e6857600080fd5b60209288019283019235915083821115613e8157600080fd5b8160061b3603831315613e9357600080fd5b8685030160a0870152613219848284613d44565b601f821115610c21576000816000526020600020601f850160051c81016020861015613ed05750805b601f850160051c820191505b81811015611d1a57828155600101613edc565b67ffffffffffffffff831115613f0757613f076138eb565b613f1b83613f158354613b60565b83613ea7565b6000601f841160018114613f6d5760008515613f375750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fbc5786850135825560209485019460019092019101613f9c565b5086821015613ff7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561404381613478565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140a9576140a96138eb565b8054838255808410156141365760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140ea576140ea614009565b80861686146140fb576140fb614009565b5060008360005260206000208360011b81018760011b820191505b80821015614131578282558284830155600282019150614116565b505050505b5060008181526020812083915b85811015611d1a576141558383614038565b6040929092019160029190910190600101614143565b81358155600181016020830135614181816133c4565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141c16040860186613c20565b935091506141d3838360028701613eef565b6141e06060860186613c20565b935091506141f2838360038701613eef565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261422957600080fd5b91840191823591508082111561423e57600080fd5b506020820191508060061b360382131561425757600080fd5b6129b0818360048601614090565b60008261429b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142b257600080fd5b8151612c0a81613478565b815167ffffffffffffffff8111156142d7576142d76138eb565b6142eb816142e58454613b60565b84613ea7565b602080601f83116001811461433e57600084156143085750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561438b5788860151825594840194600190910190840161436c565b50858210156143c757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610bdc57610bdc614009565b67ffffffffffffffff83168152604060208201526000825160a0604084015261441660e0840182613506565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144528383613506565b9250604086015191508085840301608086015261446f8383613624565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506135ad8282613506565b6000602082840312156144bf57600080fd5b5051919050565b6000602082840312156144d857600080fd5b8151612c0a816134b756fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -409,11 +409,11 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) Owner() (common.Addr return _SelfFundedPingPong.Contract.Owner(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chainConfigs", arg0) + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) outstruct := new(SChainConfigs) if err != nil { @@ -428,16 +428,16 @@ func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.Ca } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_SelfFundedPingPong *SelfFundedPingPongSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, arg0) + return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, destChainSelector) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChainConfigs(arg0 uint64) (SChainConfigs, +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, arg0) + return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, destChainSelector) } func (_SelfFundedPingPong *SelfFundedPingPongCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { @@ -2636,7 +2636,7 @@ type SelfFundedPingPongInterface interface { Owner(opts *bind.CallOpts) (common.Address, error) - SChainConfigs(opts *bind.CallOpts, arg0 uint64) (SChainConfigs, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 4f53971262..ee211921f8 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -5,10 +5,10 @@ burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin fee3f82935ce7a26c65e12f19a472a4fccdae62755abdb42d8b0a01f0f06981a burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin c7efa00d2be62a97a814730c8e13aa70794ebfdd38a9f3b3c11554a5dfd70478 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin a0728e186af74968101135a58a483320ced9ab79b22b1b24ac6994254ee79097 -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 7a02b5e5da9f1ec593e6916d45a2972330dfe8d4a40eeb3d76fd57b852a7d230 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 4ff0f5166791975a28c8cca820d5b23636877a39db90090aa18ad7d2d122b785 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 8f0cb5cff5611460db2527342ac74723ffc2c57afb3866eefe862b0dad2e75bc -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin f79420dab435b1c44d695cc1cfb1771e4ba1a7224814198b4818c043219e337a +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 7f7045fe8bd0d0a5bfb69a74cb782c1def4e40c6690f78f3686abf8702411cca +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0aa9dc4d97b89bbd3fb273d1386b8bd46b2d8c5fa2a4e26cc0ab0589b20c7269 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 02a339415eb7dc90e167a7122beeed340b4171930b28646df16432e692f05b6d +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 96fade4180f686c927f7a599ba18a29efd05df117e1d31b57427b16cfcda370f ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -28,11 +28,11 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin fa113052eafd644fd9d25558bf13ebf0be15e51de93477d74eea913801d0f752 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin d41d1f20d767c4b050045a1909e6d7a87e919f0fd3a17831e1fe455c87a21e1d price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin cbe7698bfd811b485ac3856daf073a7bdebeefdf2583403ca4a19d5b7e2d4ae8 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin eedfacbd19d13edfbddae5a693aa58c31595732ecb54f371d3155da244b65344 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 9dd31e03f6c414fc8961e95515962039f093f35d0f27bfde32fce5add2b6d15a token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 48caf06855a2f60455364d384e5fb2e6ecdf0a9ce4c1fc706b54b9885df76695 From 19830ddcf6aefa6c43f55d02bd59dd61662fb760 Mon Sep 17 00:00:00 2001 From: Matt Yang Date: Wed, 3 Jul 2024 23:17:46 -0400 Subject: [PATCH 30/61] more comments to address --- .../applications/external/CCIPClientBase.sol | 40 ++++++++++++++----- .../applications/external/CCIPReceiver.sol | 20 +++++++++- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol index 09a532c20e..714fcda4f1 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol @@ -8,6 +8,8 @@ import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; import {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; +// TODO how do you feel about just renaming this to `CCIPBase` +// TODO add natspec comments on top of every contract abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { using SafeERC20 for IERC20; using Address for address; @@ -18,18 +20,25 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { error InvalidSender(bytes sender); error InvalidRecipient(bytes recipient); + // TODO every field in a struct should have comment, also do spack comments alignment, for example struct ApprovedSenderUpdate { - uint64 destChainSelector; - bytes sender; // The address which initiated source-chain message, abi-encoded in case of a non-EVM-compatible network + uint64 destChainSelector; // Chainselector for a source chain that is allowed to call this dapp + bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } + // TODO change disabled to enabled so the default value is false if it is not configured + // TODO actually, can you use recipient.length != 0 as the enabled flag? Saves 1 slot struct ChainConfig { bool disabled; - bytes recipient; // The address to send messages to on the destination-chain, abi.encode(addr) if an EVM-compatible networks - bytes extraArgsBytes; // Includes additional configs such as manual gas limit, and out-of-order-execution. Should not be supplied at runtime to prevent unexpected contract behavior + bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. + bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and OOO execution. + + + // TODO important to add context on why this is a nested mapping; afaik it is to support remote one-sided dapp upgrades mapping(bytes recipient => bool isApproved) approvedSender; } + // TODO I recall there were some discussions about upgradable Router, was it confirmed with GTM/Devrel we can have immutable router? address internal immutable i_ccipRouter; mapping(uint64 destChainSelector => ChainConfig) public s_chainConfigs; @@ -43,7 +52,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Router Management │ // ================================================================ - /// @notice returns the address of the CCIP Router set at contract-deployment + /// @notice returns the address of the CCIP Router set at contract deployment function getRouter() public view virtual returns (address) { return i_ccipRouter; } @@ -58,8 +67,10 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Sender/Receiver Management │ // ================================================================ - /// @notice modify the list of approved source-chain contracts which can send messages to this contract through CCIP + // TODO we should be consistent in our styles, "source chain" is preferred over "soure-chain", when in doubt, check other contracts for reference + /// @notice modify the list of approved source chain contracts which can send messages to this contract through CCIP /// @dev removes are executed before additions, so a contract present in both will be approved at the end of execution + // TODO emit events here function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes @@ -77,6 +88,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain /// @param senderAddr The address which sent the message on the source-chain, abi-encoded if evm-compatible /// @return bool Whether the address is approved or not to invoke functions on this contract + // TODO this function isn't being used elsewhere, this implies we are missing validation in receiver function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } @@ -85,19 +97,25 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - /// @notice function support native-fee-token pre-funding in all children implementing the ccipSend function + // TODO update comments to be explicit about what the function does. + /// @notice Accepts prefunding in native fee token. + /// @dev All the example applications accept prefunding. This function should be removed if prefunding in native fee token is not required. receive() external payable {} /// @notice Allow the owner to recover any native-tokens sent to this contract out of error. - /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// TODO this is withdraw native, it isn't related to token recovery + /// @dev Function should not be used to recover tokens from failed messages, abandonFailedMessage() should be used instead /// @param to A payable address to send the recovered tokens to /// @param amount the amount of native tokens to recover, denominated in wei function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); } + // TODO provide context on instructions, instead of just saying what to do, also explain why /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error. - /// @dev Function should not be used to recover tokens from failed-messages, abandonFailedMessage() should be used instead + /// @dev This should NOT be used for recoverying tokens from a failed message. Token recoveries can happen only if + /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. + /// For implementation of token recovery, see inheriting contracts. /// @param to A payable address to send the recovered tokens to /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { @@ -108,6 +126,8 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Chain Management │ // ================================================================ + // TODO let's combine `enabledChain` and `disableChain` into a single `applyChainUpdates` that takes in an array to allow for bulk edits + // Reference similar function in TokenPool /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP /// @param chainSelector A unique CCIP-specific identifier for the source chain /// @param recipient The address a message should be sent to on the destination chain. There should only be one per-chain, and is abi-encoded if EVM-compatible. @@ -124,7 +144,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // Set any additional args such as enabling out-of-order execution or manual gas-limit if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; - // If config was previously disabled, then re-enable it; + // If config was previously disabled, then re-enable it if (currentConfig.disabled) currentConfig.disabled = false; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index b6dc6fc8b0..02bcfabc59 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -25,6 +25,7 @@ contract CCIPReceiver is CCIPClientBase { // RESOLVED is first so that the default value is resolved. RESOLVED, FAILED, + // TODO comment ABANDONED } @@ -56,6 +57,16 @@ contract CCIPReceiver is CCIPClientBase { { try this.processMessage(message) {} catch (bytes memory err) { + // TODO kinda dangerous comments here. + // The original suggestion was: + // if you want custom retry logic, plus owner extracting tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver + // this means the message will appear as success to CCIP, and you can track the actual message state within the dapp + // if you do not need custom retry logic, and you don't need owner token recovery function, then you don't need the try-catch here + // because you can use ccip manualExecution as a retry function + // + // we should not phrase it such that "Any failures should be tracked by individual Dapps", it's only the case if they want custom retry pattern + // as opposed to default manual exec, or they want token recovery feature. + // Mark the message as having failed. Any failures should be tracked by individual Dapps, since CCIP // will mark the message as having been successfully delivered. CCIP makes no assurances about message delivery // other than invocation with proper gas limit. Any logic/execution errors should be tracked by separately. @@ -87,6 +98,7 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== + // TODO we don't do new @dev on every new line, same for @notice, when in doubt check other contracts. /// @notice Execute a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. /// @dev function will revert if the messageId was not already stored as having failed its initial execution @@ -108,10 +120,14 @@ contract CCIPReceiver is CCIPClientBase { } /// @notice A function that should contain any special logic needed to "retry" processing of a previously failed message. - /// @dev if the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead + /// TODO these funtions do not exist + /// @dev If the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead /// @dev function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden - function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner {} + function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner { + // TODO how about we add a default implementation that calls `processMessage`, and comments for overrides + } + // TODO double notices /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. /// @dev this function is only callable as the owner, and From 3f07b0e59936d400ea1c1880f84a5433797c6dde Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 8 Jul 2024 14:51:10 -0400 Subject: [PATCH 31/61] fixes for more requested feedback. Restructure ACK receivers and ClientBase --- contracts/gas-snapshots/ccip.gas-snapshot | 61 ++++----- .../{CCIPClientBase.sol => CCIPBase.sol} | 119 ++++++++++-------- .../ccip/applications/external/CCIPClient.sol | 46 ++----- .../external/CCIPClientWithACK.sol | 48 +++++++ .../applications/external/CCIPReceiver.sol | 59 ++++----- .../external/CCIPReceiverWithACK.sol | 21 ++-- .../ccip/applications/external/CCIPSender.sol | 18 ++- .../applications/internal/PingPongDemo.sol | 8 +- ...Test.t.sol => CCIPClientWithACKTest.t.sol} | 59 ++++----- .../external/CCIPReceiverTest.t.sol | 75 +++++++---- .../external/CCIPReceiverWithAckTest.t.sol | 30 +++-- .../external/CCIPSenderTest.t.sol | 12 +- .../helpers/receivers/CCIPReceiverBasic.sol | 6 +- 13 files changed, 305 insertions(+), 257 deletions(-) rename contracts/src/v0.8/ccip/applications/external/{CCIPClientBase.sol => CCIPBase.sol} (56%) create mode 100644 contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol rename contracts/src/v0.8/ccip/test/applications/external/{CCIPClientTest.t.sol => CCIPClientWithACKTest.t.sol} (78%) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 04def4f478..20b4c76542 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,10 +34,10 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_ccipReceiveAndSendAck() (gas: 331271) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return() (gas: 347022) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 241425) -CCIPClientTest:test_send_tokens_that_are_not_feeToken() (gas: 552000) +CCIPClientTest:test_ccipReceiveAndSendAck_Success() (gas: 331825) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348272) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) +CCIPClientTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552173) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) @@ -88,21 +88,22 @@ CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1160583) CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1158919) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) -CCIPReceiverTest:test_HappyPath_Success() (gas: 193588) -CCIPReceiverTest:test_Recovery_from_invalid_sender() (gas: 428817) -CCIPReceiverTest:test_Recovery_with_intentional_revert() (gas: 444784) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_REVERT() (gas: 205094) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert() (gas: 425167) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 420799) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner() (gas: 18806) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message() (gas: 55172) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack() (gas: 331323) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() (gas: 437616) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor() (gas: 2643085) -CCIPReceiverWithAckTest:test_modifyFeeToken() (gas: 72519) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339182) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224256) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 367940) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193812) +CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 430948) +CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 445121) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 199816) +CCIPReceiverTest:test_modifyRouter_Success() (gas: 26470) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 427992) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 421204) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20689) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56254) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331794) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438731) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2948564) +CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74835) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339572) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224467) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 368160) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -209,7 +210,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181595) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 189957) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47044) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1408453) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1709977) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 248935) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 174421) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193347) @@ -235,8 +236,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207222) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28130) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 158903) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1479082) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3171008) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1780718) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3496512) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209279) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 209853) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 664710) @@ -375,7 +376,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165192) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177948) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1376538) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1678062) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -407,14 +408,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131906) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1457911) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1759547) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186809) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189003) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188464) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2844986) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3171279) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -685,9 +686,9 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380711) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308231) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234226) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 308708) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17766) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234292) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -834,8 +835,8 @@ Router_routeMessage:test_ManualExec_Success() (gas: 35381) Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116) Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724) Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290288) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 451971) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 290920) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 456179) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20203) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol similarity index 56% rename from contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol rename to contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 714fcda4f1..5974e79b70 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -2,15 +2,15 @@ pragma solidity ^0.8.0; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; -import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; import {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; -// TODO how do you feel about just renaming this to `CCIPBase` -// TODO add natspec comments on top of every contract -abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { +/// @title CCIPBase +/// @notice This contains the boilerplate code for managing chains and tokens your contract may interact with as part of CCIP. It does not send or receive messages through CCIP only manages supported chains and sources/destinations. +/// @dev This contract is abstract, but does not have any functions which must be implemented by a child. +abstract contract CCIPBase is OwnerIsCreator { using SafeERC20 for IERC20; using Address for address; @@ -20,32 +20,38 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { error InvalidSender(bytes sender); error InvalidRecipient(bytes recipient); - // TODO every field in a struct should have comment, also do spack comments alignment, for example + event CCIPRouterModified(address indexed oldRouter, address indexed newRouter); + event TokensWithdrawnByOwner(address indexed token, address indexed to, uint256 amount); + event ApprovedSenderModified(uint64 indexed destChainSelector, bytes indexed recipient, bool isBeingApproved); + + event ChainAdded(uint64 remoteChainSelector, bytes recipient, bytes extraArgsBytes); + event ChainRemoved(uint64 removeChainSelector); + struct ApprovedSenderUpdate { uint64 destChainSelector; // Chainselector for a source chain that is allowed to call this dapp bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } - // TODO change disabled to enabled so the default value is false if it is not configured - // TODO actually, can you use recipient.length != 0 as the enabled flag? Saves 1 slot + struct ChainUpdate { + uint64 chainSelector; + bool allowed; + bytes recipient; + bytes extraArgsBytes; + } + struct ChainConfig { - bool disabled; - bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. + bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and OOO execution. - - - // TODO important to add context on why this is a nested mapping; afaik it is to support remote one-sided dapp upgrades - mapping(bytes recipient => bool isApproved) approvedSender; + mapping(bytes recipient => bool isApproved) approvedSender; // Mapping is nested to support work-flows where Dapps may need to receive messages from one-or-more contracts on a source chain, or to support one-sided dapp upgrades. } - // TODO I recall there were some discussions about upgradable Router, was it confirmed with GTM/Devrel we can have immutable router? - address internal immutable i_ccipRouter; + address internal s_ccipRouter; mapping(uint64 destChainSelector => ChainConfig) public s_chainConfigs; constructor(address router) { if (router == address(0)) revert ZeroAddressNotAllowed(); - i_ccipRouter = router; + s_ccipRouter = router; } // ================================================================ @@ -54,7 +60,7 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { /// @notice returns the address of the CCIP Router set at contract deployment function getRouter() public view virtual returns (address) { - return i_ccipRouter; + return s_ccipRouter; } /// @dev only calls from the set router are accepted. @@ -67,28 +73,32 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Sender/Receiver Management │ // ================================================================ - // TODO we should be consistent in our styles, "source chain" is preferred over "soure-chain", when in doubt, check other contracts for reference /// @notice modify the list of approved source chain contracts which can send messages to this contract through CCIP /// @dev removes are executed before additions, so a contract present in both will be approved at the end of execution - // TODO emit events here function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes ) external onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { delete s_chainConfigs[removes[i].destChainSelector].approvedSender[removes[i].sender]; + + // Third parameter is false to indicate that the sender's previous approval is being revoked, to improve off-chain event indexing + emit ApprovedSenderModified(removes[i].destChainSelector, removes[i].sender, false); } for (uint256 i = 0; i < adds.length; ++i) { s_chainConfigs[adds[i].destChainSelector].approvedSender[adds[i].sender] = true; + + // Third parameter is true to indicate that the sender is being approved, to improve off-chain event indexing + emit ApprovedSenderModified(adds[i].destChainSelector, adds[i].sender, true); } } /// @notice Return whether a contract on the specified source chain is authorized to send messages to this contract through CCIP + /// @dev This function does not revert on an unapproved-sender, and should only be used as a getter-function for querying approvals from a ChainConfig object. The isValidSender modifier should be used instead for incoming message-validation /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain - /// @param senderAddr The address which sent the message on the source-chain, abi-encoded if evm-compatible + /// @param senderAddr The address which sent the message on the source chain, abi-encoded if evm-compatible /// @return bool Whether the address is approved or not to invoke functions on this contract - // TODO this function isn't being used elsewhere, this implies we are missing validation in receiver function isApprovedSender(uint64 sourceChainSelector, bytes calldata senderAddr) external view returns (bool) { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } @@ -97,22 +107,22 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { // │ Fee Token Management │ // =============================================================== - // TODO update comments to be explicit about what the function does. - /// @notice Accepts prefunding in native fee token. + /// @notice Accepts incoming native-tokens to support prefunding in native fee token. /// @dev All the example applications accept prefunding. This function should be removed if prefunding in native fee token is not required. receive() external payable {} - /// @notice Allow the owner to recover any native-tokens sent to this contract out of error. - /// TODO this is withdraw native, it isn't related to token recovery + /// @notice Allow the owner to recover any native-tokens sent to this contract out of error, or to withdraw any native-tokens which were used for pre-funding if the fee-token is switched away from native-tokens. /// @dev Function should not be used to recover tokens from failed messages, abandonFailedMessage() should be used instead /// @param to A payable address to send the recovered tokens to /// @param amount the amount of native tokens to recover, denominated in wei function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { Address.sendValue(to, amount); + + // Use the same withdrawal event signature as withdrawTokens() but use address(0) to denote native-tokens. + emit TokensWithdrawnByOwner(address(0), to, amount); } - // TODO provide context on instructions, instead of just saying what to do, also explain why - /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error. + /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error or withdraw any fee-tokens which were sent as a source of fee-token pre-funding /// @dev This should NOT be used for recoverying tokens from a failed message. Token recoveries can happen only if /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. /// For implementation of token recovery, see inheriting contracts. @@ -120,49 +130,60 @@ abstract contract CCIPClientBase is OwnerIsCreator, ITypeAndVersion { /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(to, amount); + + emit TokensWithdrawnByOwner(token, to, amount); } // ================================================================ // │ Chain Management │ // ================================================================ - // TODO let's combine `enabledChain` and `disableChain` into a single `applyChainUpdates` that takes in an array to allow for bulk edits + function modifyRouter(address newRouter) external onlyOwner { + if (newRouter == address(0)) revert ZeroAddressNotAllowed(); + + // Store the old router in memory to emit event + address currentRouter = s_ccipRouter; + + s_ccipRouter = newRouter; + + emit CCIPRouterModified(currentRouter, newRouter); + } + // Reference similar function in TokenPool /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP - /// @param chainSelector A unique CCIP-specific identifier for the source chain - /// @param recipient The address a message should be sent to on the destination chain. There should only be one per-chain, and is abi-encoded if EVM-compatible. - /// @param _extraArgsBytes additional optional ccipSend parameters. Do not need to be set unless necessary based on the application-logic - function enableChain( - uint64 chainSelector, - bytes calldata recipient, - bytes calldata _extraArgsBytes - ) external onlyOwner { - ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; + function applyChainUpdates(ChainUpdate[] calldata chains) external onlyOwner { + for (uint256 i = 0; i < chains.length; ++i) { + if (!chains[i].allowed) { + delete s_chainConfigs[chains[i].chainSelector].recipient; + emit ChainRemoved(chains[i].chainSelector); + } else { + // The existence of a stored recipient is used to denote a chain being enabled, so the length here cannot be zero + if (chains[i].recipient.length == 0) revert ZeroAddressNotAllowed(); - currentConfig.recipient = recipient; + ChainConfig storage currentConfig = s_chainConfigs[chains[i].chainSelector]; - // Set any additional args such as enabling out-of-order execution or manual gas-limit - if (_extraArgsBytes.length != 0) currentConfig.extraArgsBytes = _extraArgsBytes; + currentConfig.recipient = chains[i].recipient; - // If config was previously disabled, then re-enable it - if (currentConfig.disabled) currentConfig.disabled = false; - } + // Set any additional args such as enabling out-of-order execution or manual gas-limit + if (chains[i].extraArgsBytes.length != 0) currentConfig.extraArgsBytes = chains[i].extraArgsBytes; - /// @notice Mark a chain as not supported for sending-receiving messages to/from this contract via CCIP. - /// @dev If a chain needs to be re-enabled after being disabled, the owner must call enableChain() to support it again. - function disableChain(uint64 chainSelector) external onlyOwner { - s_chainConfigs[chainSelector].disabled = true; + emit ChainAdded(chains[i].chainSelector, chains[i].recipient, chains[i].extraArgsBytes); + } + } } modifier isValidChain(uint64 chainSelector) { // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; - if (currentConfig.recipient.length == 0 || currentConfig.disabled) revert InvalidChain(chainSelector); + if (currentConfig.recipient.length == 0) revert InvalidChain(chainSelector); _; } modifier isValidSender(uint64 chainSelector, bytes memory sender) { - if (!s_chainConfigs[chainSelector].approvedSender[sender]) revert InvalidSender(sender); + // If the chain is disabled, then short-circuit trigger a revert because no sender should be valid + if (s_chainConfigs[chainSelector].recipient.length == 0 || !s_chainConfigs[chainSelector].approvedSender[sender]) { + revert InvalidSender(sender); + } _; } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 7376a3cabf..f22837b995 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -9,25 +9,20 @@ import {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; -/// @notice CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated +/// @title CCIPClient +/// @notice This contract implements logic for sending and receiving CCIP Messages. It utilizes CCIPReceiver's defensive patterns by default. +/// @dev CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; - error InvalidConfig(); - error CannotAcknowledgeUnsentMessage(bytes32); - constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} - function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPClient 1.0.0-dev"; - } - /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, bytes memory data - ) public payable isValidChain(destChainSelector) returns (bytes32 messageId) { + ) public payable virtual isValidChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: s_chainConfigs[destChainSelector].recipient, data: data, @@ -42,18 +37,18 @@ contract CCIPClient is CCIPReceiverWithACK { // Do not approve the tokens if it is the feeToken, otherwise the approval amount may overflow if (tokenAmounts[i].token != address(s_feeToken)) { - IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeApprove(s_ccipRouter, tokenAmounts[i].amount); } } - uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken if (address(s_feeToken) != address(0)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } - messageId = IRouterClient(i_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( + messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( destChainSelector, message ); @@ -64,31 +59,4 @@ contract CCIPClient is CCIPReceiverWithACK { return messageId; } - - /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received - /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic - function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { - (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); - - if (payload.messageType == MessageType.OUTGOING) { - // Insert Processing workflow here. - - // If the message was outgoing, then send an ack response. - _sendAck(message); - } else if (payload.messageType == MessageType.ACK) { - // Decode message into the message-heacder and the messageId to ensure the message is encoded correctly - (bytes memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); - - // Ensure Ack Message contains proper message header - if (keccak256(messageHeader) != keccak256(ACK_MESSAGE_HEADER)) revert InvalidAckMessageHeader(); - - // Make sure the ACK message was originally sent by this contract - if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); - - // Mark the message has finalized from a proper ack-message. - s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; - - emit MessageAckReceived(messageId); - } - } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol new file mode 100644 index 0000000000..0c62f4ced9 --- /dev/null +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Client} from "../../libraries/Client.sol"; +import {CCIPClient} from "./CCIPClient.sol"; + +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; + +/// @title CCIPClientWithACK +/// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. +/// @dev ccipSend functionality has been inherited from CCIPClient.sol, and _sendACK() from CCIPReceiverWithACK, so only processMessage() must be overridden to enable full functionality for processing incoming messages for ACK's +contract CCIPClientWithACK is CCIPClient { + using SafeERC20 for IERC20; + + error CannotAcknowledgeUnsentMessage(bytes32); + + constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + + /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received + /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic + function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { + (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); + + if (payload.messageType == MessageType.OUTGOING) { + // Insert Processing workflow here. + + // If the message was outgoing, then send an ack response. + _sendAck(message); + } else if (payload.messageType == MessageType.ACK) { + // Decode message into the message-header and the messageId to ensure the message is encoded correctly + (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); + + // Ensure Ack Message contains proper message header + if (keccak256(abi.encode(messageHeader)) != keccak256(abi.encode(ACK_MESSAGE_HEADER))) { + revert InvalidAckMessageHeader(); + } + + // Make sure the ACK message was originally sent by this contract + if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); + + // Mark the message has finalized from a proper ack-message. + s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; + + emit MessageAckReceived(messageId); + } + } +} diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 02bcfabc59..4e071669f7 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -2,13 +2,16 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; +import {CCIPBase} from "./CCIPBase.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; -contract CCIPReceiver is CCIPClientBase { +/// @title CCIPReceiver +/// @notice This contract is capable of receiving incoming messages from the CCIP-Router. +/// @dev This contract implements various "defensive" measures to enhance security and efficiency. These include the ability to implement custom-retry logic and ownership-based token-recovery functions. +contract CCIPReceiver is CCIPBase { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -20,13 +23,12 @@ contract CCIPReceiver is CCIPClientBase { event MessageRecovered(bytes32 indexed messageId); event MessageAbandoned(bytes32 indexed messageId, address tokenReceiver); - // Example error code, could have many different error codes. enum ErrorCode { - // RESOLVED is first so that the default value is resolved. - RESOLVED, - FAILED, - // TODO comment - ABANDONED + RESOLVED, // RESOLVED is the default status for any incoming message, unless execution fails and it is marked as FAILED. + FAILED, // FAILED messages are messages which reverted during execution of processMessage() as part of the ccipReceive() try catch loop. + ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable, and can only be triggered by the contract owner. + // Only a message that was previously marked as FAILED can be abandoned. + } // The message contents of failed messages are stored here. @@ -35,18 +37,14 @@ contract CCIPReceiver is CCIPClientBase { // Contains failed messages and their state. EnumerableMap.Bytes32ToUintMap internal s_failedMessages; - constructor(address router) CCIPClientBase(router) {} - - function typeAndVersion() external pure virtual returns (string memory) { - return "CCIPReceiver 1.0.0-dev"; - } + constructor(address router) CCIPBase(router) {} // ================================================================ // │ Incoming Message Processing | // ================================================================ /// @notice The entrypoint for the CCIP router to call. This function should - /// never revert, all errors should be handled internally in this contract. + /// not revert, all errors should be handled internally in this contract. /// @param message The message to process. /// @dev Extremely important to ensure only router calls this. function ccipReceive(Client.Any2EVMMessage calldata message) @@ -57,19 +55,11 @@ contract CCIPReceiver is CCIPClientBase { { try this.processMessage(message) {} catch (bytes memory err) { - // TODO kinda dangerous comments here. - // The original suggestion was: - // if you want custom retry logic, plus owner extracting tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver - // this means the message will appear as success to CCIP, and you can track the actual message state within the dapp - // if you do not need custom retry logic, and you don't need owner token recovery function, then you don't need the try-catch here - // because you can use ccip manualExecution as a retry function - // - // we should not phrase it such that "Any failures should be tracked by individual Dapps", it's only the case if they want custom retry pattern - // as opposed to default manual exec, or they want token recovery feature. - - // Mark the message as having failed. Any failures should be tracked by individual Dapps, since CCIP - // will mark the message as having been successfully delivered. CCIP makes no assurances about message delivery - // other than invocation with proper gas limit. Any logic/execution errors should be tracked by separately. + // If custom retry logic is desired, plus granting the owner the ability to extract tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver. + // This make the message appear as a success to CCIP, and actual message state and any residual errors can be tracked within the dapp with greater granularity. + // If custom retry logic and token recovery functions are not needed, then this try-catch can be removed, + // and ccip manualExecution can be used a retry function instead. + s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); // Store the message contents in case it needs to be retried or abandoned @@ -98,10 +88,9 @@ contract CCIPReceiver is CCIPClientBase { // │ Failed Message Processing | // ================== ============================================== - // TODO we don't do new @dev on every new line, same for @notice, when in doubt check other contracts. - /// @notice Execute a message that failed initial delivery, but with different logic specifically for re-execution. + /// @notice Executes a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. - /// @dev function will revert if the messageId was not already stored as having failed its initial execution + /// @dev Function will revert if the messageId was not already stored as having failed its initial execution /// @param messageId the unique ID of the CCIP-message which failed initial-execution. function retryFailedMessage(bytes32 messageId) external { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); @@ -120,17 +109,15 @@ contract CCIPReceiver is CCIPClientBase { } /// @notice A function that should contain any special logic needed to "retry" processing of a previously failed message. - /// TODO these funtions do not exist - /// @dev If the owner wants to retrieve tokens without special logic, then abandonMessage() or recoverTokens() should be used instead - /// @dev function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden + /// @dev If the owner wants to retrieve tokens without special logic, then abandonFailedMessage(), withdrawNativeTokens(), or withdrawTokens() should be used instead + /// @dev This function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner { // TODO how about we add a default implementation that calls `processMessage`, and comments for overrides } - // TODO double notices /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried - /// @notice function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. - /// @dev this function is only callable as the owner, and + /// @dev function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. + /// @dev function is only callable by the contract owner function abandonFailedMessage(bytes32 messageId, address receiver) external onlyOwner { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index aee2b4686d..7bda3e9163 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -10,6 +10,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; +/// @title CCIPReceiverWithACK contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -39,7 +40,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { MessageType messageType; } - bytes public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; + string public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; // Current feeToken IERC20 public s_feeToken; @@ -55,10 +56,6 @@ contract CCIPReceiverWithACK is CCIPReceiver { } } - function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPReceiverWithACK 1.0.0-dev"; - } - function modifyFeeToken(address token) external onlyOwner { // If the current fee token is not-native, zero out the allowance to the router for safety if (address(s_feeToken) != address(0)) { @@ -109,14 +106,16 @@ contract CCIPReceiverWithACK is CCIPReceiver { if (payload.messageType == MessageType.OUTGOING) { // Insert Processing workflow here. - // If the message was outgoing on the source-chain, then send an ack response. + // If the message was outgoing on the source chain, then send an ack response. _sendAck(message); } else if (payload.messageType == MessageType.ACK) { // Decode message into the message header and the messageId to ensure the message is encoded correctly - (bytes memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes, bytes32)); + (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); - // Ensure Ack Message contains proper message header - if (keccak256(messageHeader) != keccak256(ACK_MESSAGE_HEADER)) revert InvalidAckMessageHeader(); + // Ensure Ack Message contains proper message header. Must abi.encode() before hashing since its of the string type + if (keccak256(abi.encode(messageHeader)) != keccak256(abi.encode(ACK_MESSAGE_HEADER))) { + revert InvalidAckMessageHeader(); + } // Make sure the ACK message has not already been acknowledged if (s_messageStatus[messageId] == MessageStatus.ACKNOWLEDGED) revert MessageAlreadyAcknowledged(messageId); @@ -141,9 +140,9 @@ contract CCIPReceiverWithACK is CCIPReceiver { feeToken: address(s_feeToken) }); - uint256 feeAmount = IRouterClient(i_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); + uint256 feeAmount = IRouterClient(s_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); - bytes32 ACKmessageId = IRouterClient(i_ccipRouter).ccipSend{ + bytes32 ACKmessageId = IRouterClient(s_ccipRouter).ccipSend{ value: address(s_feeToken) == address(0) ? feeAmount : 0 }(incomingMessage.sourceChainSelector, outgoingMessage); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 88f7d20ff9..3050786fa4 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; import {Client} from "../../libraries/Client.sol"; -import {CCIPClientBase} from "./CCIPClientBase.sol"; +import {CCIPBase} from "./CCIPBase.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; @@ -22,7 +22,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// like the example below will inherit the trust properties of CCIP (i.e. the oracle network). /// @dev The receiver's are encoded offchain and passed as direct arguments to permit supporting /// new chain family receivers (e.g. a solana encoded receiver address) without upgrading. -contract CCIPSender is CCIPClientBase { +contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; error InvalidConfig(); @@ -31,11 +31,7 @@ contract CCIPSender is CCIPClientBase { event MessageSent(bytes32 messageId); event MessageReceived(bytes32 messageId); - constructor(address router) CCIPClientBase(router) {} - - function typeAndVersion() external pure virtual override returns (string memory) { - return "CCIPSender 1.0.0-dev"; - } + constructor(address router) CCIPBase(router) {} /// @notice sends a message through CCIP to the router function ccipSend( @@ -55,18 +51,18 @@ contract CCIPSender is CCIPClientBase { for (uint256 i = 0; i < tokenAmounts.length; ++i) { // Transfer the tokens to this contract to pay the router for the tokens in tokenAmounts IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); - IERC20(tokenAmounts[i].token).safeIncreaseAllowance(i_ccipRouter, tokenAmounts[i].amount); + IERC20(tokenAmounts[i].token).safeIncreaseAllowance(s_ccipRouter, tokenAmounts[i].amount); } - uint256 fee = IRouterClient(i_ccipRouter).getFee(destChainSelector, message); + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); if (feeToken != address(0)) { IERC20(feeToken).safeTransferFrom(msg.sender, address(this), fee); - IERC20(feeToken).safeIncreaseAllowance(i_ccipRouter, fee); + IERC20(feeToken).safeIncreaseAllowance(s_ccipRouter, fee); } messageId = - IRouterClient(i_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); + IRouterClient(s_ccipRouter).ccipSend{value: feeToken == address(0) ? fee : 0}(destChainSelector, message); emit MessageSent(messageId); diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 64669c3819..cadc2cb857 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; -import {CCIPClient} from "../external/CCIPClient.sol"; +import {CCIPClientWithACK} from "../external/CCIPClientWithACK.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication -contract PingPongDemo is CCIPClient { +contract PingPongDemo is CCIPClientWithACK { using SafeERC20 for IERC20; event Ping(uint256 pingPongCount); @@ -24,9 +24,9 @@ contract PingPongDemo is CCIPClient { bool private s_isPaused; // CCIPClient will handle the token approval so there's no need to do it here - constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + constructor(address router, IERC20 feeToken) CCIPClientWithACK(router, feeToken) {} - function typeAndVersion() external pure virtual override returns (string memory) { + function typeAndVersion() external pure virtual returns (string memory) { return "PingPongDemo 1.3.0"; } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol similarity index 78% rename from contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol rename to contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index ae924a8c60..b867637b08 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClient} from "../../../applications/external/CCIPClient.sol"; +import {CCIPClientWithACK} from "../../../applications/external/CCIPClientWithACK.sol"; -import {CCIPReceiverWithACK} from "../../../applications/external/CCIPClient.sol"; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; +import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; import {IRouterClient} from "../../../interfaces/IRouterClient.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -20,23 +20,32 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { event MessageAckSent(bytes32 incomingMessageId); event MessageAckReceived(bytes32); - CCIPClient internal s_sender; + CCIPClientWithACK internal s_sender; uint64 internal destChainSelector = DEST_CHAIN_SELECTOR; function setUp() public virtual override { EVM2EVMOnRampSetup.setUp(); - s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - s_sender.enableChain(destChainSelector, abi.encode(address(s_sender)), ""); + s_sender = new CCIPClientWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: destChainSelector, + allowed: true, + recipient: abi.encode(address(s_sender)), + extraArgsBytes: "" + }); + + s_sender.applyChainUpdates(chainUpdates); + + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); senderUpdates[0] = - CCIPClientBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); + CCIPBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_sender))}); - s_sender.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); + s_sender.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } - function test_ccipReceiveAndSendAck() public { + function test_ccipReceiveAndSendAck_Success() public { bytes32 messageId = keccak256("messageId"); bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; address token = address(s_sourceFeeToken); @@ -83,7 +92,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), receiverBalanceBefore - feeTokenAmount); } - function test_ccipSend_withNonNativeFeetoken_andNoDestTokens() public { + function test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() public { address token = address(s_sourceFeeToken); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -108,7 +117,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } - function test_ccipSendAndReceiveAck_in_return() public { + function test_ccipSendAndReceiveAck_in_return_Success() public { address token = address(s_sourceFeeToken); uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); @@ -150,36 +159,13 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { ); } - // function test_ccipSend_withNativeFeeToken_butInsufficientMsgValue_REVERT() public { - // Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); - - // Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ - // receiver: abi.encode(address(s_sender)), - // data: "FAKE_DATA", - // tokenAmounts: destTokenAmounts, - // feeToken: address(0), - // extraArgs: "" - // }); - - // uint256 feeTokenAmount = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message); - - // vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector); - // s_sender.ccipSend{value: feeTokenAmount / 2}({ - // destChainSelector: DEST_CHAIN_SELECTOR, - // tokenAmounts: destTokenAmounts, - // data: "", - // feeToken: address(0) - // }); - // } - - function test_send_tokens_that_are_not_feeToken() public { + function test_send_tokens_that_are_not_feeToken_Success() public { address token = s_sourceTokens[1]; uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); destTokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount}); // Make sure we give the receiver contract enough tokens like CCIP would. - IERC20(token).approve(address(s_sender), type(uint256).max); IERC20(s_sourceFeeToken).approve(address(s_sender), type(uint256).max); deal(token, address(this), 1e24); @@ -197,7 +183,6 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(OWNER); s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); - // feeToken: address(s_sourceFeeToken) // Assert that tokens were transfered for bridging + fees assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol index e64a5d28ab..bac560975d 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; import {CCIPReceiverReverting} from "../../helpers/receivers/CCIPReceiverReverting.sol"; @@ -23,18 +23,24 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { EVM2EVMOnRampSetup.setUp(); s_receiver = new CCIPReceiverReverting(address(s_destRouter)); - s_receiver.enableChain(sourceChainSelector, abi.encode(address(1)), ""); - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ - destChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)) + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: sourceChainSelector, + allowed: true, + recipient: abi.encode(address(s_receiver)), + extraArgsBytes: "" }); + s_receiver.applyChainUpdates(chainUpdates); - s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver))}); + + s_receiver.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } - function test_Recovery_with_intentional_revert() public { + function test_Recovery_with_intentional_Revert() public { bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); uint256 amount = 111333333777; @@ -84,7 +90,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_Recovery_from_invalid_sender() public { + function test_Recovery_from_invalid_sender_Success() public { bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); uint256 amount = 111333333777; @@ -99,7 +105,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + messageId, abi.encodeWithSelector(bytes4(CCIPBase.InvalidSender.selector), abi.encode(address(1))) ); s_receiver.ccipReceive( @@ -152,7 +158,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(1))) + messageId, abi.encodeWithSelector(bytes4(CCIPBase.InvalidSender.selector), abi.encode(address(1))) ); s_receiver.ccipReceive( @@ -214,8 +220,19 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_disableChain_andRevert_onccipReceive_REVERT() public { - s_receiver.disableChain(sourceChainSelector); + function test_disableChain_andRevert_onccipReceive_Revert() public { + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: sourceChainSelector, + allowed: false, + recipient: abi.encode(address(s_receiver)), + extraArgsBytes: "" + }); + + vm.expectEmit(); + emit CCIPBase.ChainRemoved(sourceChainSelector); + + s_receiver.applyChainUpdates(chainUpdates); bytes32 messageId = keccak256("messageId"); address token = address(s_destFeeToken); @@ -229,7 +246,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { // The receiver contract will revert if the router is not the sender. vm.startPrank(address(s_destRouter)); - vm.expectRevert(abi.encodeWithSelector(CCIPClientBase.InvalidChain.selector, sourceChainSelector)); + vm.expectRevert(abi.encodeWithSelector(CCIPBase.InvalidChain.selector, sourceChainSelector)); s_receiver.ccipReceive( Client.Any2EVMMessage({ @@ -242,14 +259,26 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_removeSender_from_approvedList_and_revert() public { - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ - destChainSelector: sourceChainSelector, - sender: abi.encode(address(s_receiver)) - }); + function test_modifyRouter_Success() public { + vm.expectRevert(abi.encodeWithSelector(CCIPBase.ZeroAddressNotAllowed.selector)); + s_receiver.modifyRouter(address(0)); + + address newRouter = address(0x1234); + + vm.expectEmit(); + emit CCIPBase.CCIPRouterModified(address(s_destRouter), newRouter); + + s_receiver.modifyRouter(newRouter); + + assertEq(s_receiver.getRouter(), newRouter, "Router Address not set correctly to the new router"); + } + + function test_removeSender_from_approvedList_and_revert_Success() public { + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: sourceChainSelector, sender: abi.encode(address(s_receiver))}); - s_receiver.updateApprovedSenders(new CCIPClientBase.ApprovedSenderUpdate[](0), senderUpdates); + s_receiver.updateApprovedSenders(new CCIPBase.ApprovedSenderUpdate[](0), senderUpdates); // assertFalse(s_receiver.s_approvedSenders(sourceChainSelector, abi.encode(address(s_receiver)))); assertFalse(s_receiver.isApprovedSender(sourceChainSelector, abi.encode(address(s_receiver)))); @@ -268,7 +297,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.expectEmit(); emit MessageFailed( - messageId, abi.encodeWithSelector(bytes4(CCIPClientBase.InvalidSender.selector), abi.encode(address(s_receiver))) + messageId, abi.encodeWithSelector(bytes4(CCIPBase.InvalidSender.selector), abi.encode(address(s_receiver))) ); s_receiver.ccipReceive( @@ -282,7 +311,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } - function test_withdraw_nativeToken_to_owner() public { + function test_withdraw_nativeToken_to_owner_Success() public { uint256 amount = 100 ether; deal(address(s_receiver), amount); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol index eca03f56f1..de0f4bf800 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -24,18 +24,24 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { EVM2EVMOnRampSetup.setUp(); s_receiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); - s_receiver.enableChain(destChainSelector, abi.encode(address(s_receiver)), ""); - CCIPClientBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPClientBase.ApprovedSenderUpdate[](1); - senderUpdates[0] = CCIPClientBase.ApprovedSenderUpdate({ - destChainSelector: destChainSelector, - sender: abi.encode(address(s_receiver)) + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: destChainSelector, + allowed: true, + recipient: abi.encode(address(s_receiver)), + extraArgsBytes: "" }); + s_receiver.applyChainUpdates(chainUpdates); - s_receiver.updateApprovedSenders(senderUpdates, new CCIPClientBase.ApprovedSenderUpdate[](0)); + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: destChainSelector, sender: abi.encode(address(s_receiver))}); + + s_receiver.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } - function test_ccipReceive_and_respond_with_ack() public { + function test_ccipReceive_and_respond_with_ack_Success() public { bytes32 messageId = keccak256("messageId"); bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; address token = address(s_sourceFeeToken); @@ -82,7 +88,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)), receiverBalanceBefore - feeTokenAmount); } - function test_ccipReceive_ack_message() public { + function test_ccipReceive_ack_message_Success() public { bytes32 messageId = keccak256("messageId"); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -115,7 +121,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { ); } - function test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_REVERT() public { + function test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() public { bytes32 messageId = keccak256("messageId"); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -147,7 +153,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(s_receiver.getMessageStatus(messageId), 1); } - function test_modifyFeeToken() public { + function test_modifyFeeToken_Success() public { // WETH is used as a placeholder for any ERC20 token address WETH = s_sourceRouter.getWrappedNative(); @@ -165,7 +171,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).allowance(address(s_receiver), address(s_sourceRouter)), 0); } - function test_feeTokenApproval_in_constructor() public { + function test_feeTokenApproval_in_constructor_Success() public { CCIPReceiverWithACK newReceiver = new CCIPReceiverWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); assertEq(IERC20(s_sourceFeeToken).allowance(address(newReceiver), address(s_sourceRouter)), type(uint256).max); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol index 5dda0bf18f..5e74236b41 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPSenderTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {CCIPSender} from "../../../applications/external/CCIPSender.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -21,7 +21,15 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { EVM2EVMOnRampSetup.setUp(); s_sender = new CCIPSender(address(s_sourceRouter)); - s_sender.enableChain(DEST_CHAIN_SELECTOR, abi.encode(address(s_sender)), ""); + + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: DEST_CHAIN_SELECTOR, + allowed: true, + recipient: abi.encode(address(s_sender)), + extraArgsBytes: "" + }); + s_sender.applyChainUpdates(chainUpdates); } function test_ccipSend_withNonNativeFeetoken_andDestTokens() public { diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol index a457ea1793..7d7c54e89b 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol @@ -5,12 +5,12 @@ import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiv import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; -import {CCIPClientBase} from "../../../applications/external/CCIPClientBase.sol"; +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; import {Client} from "../../../libraries/Client.sol"; /// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. -contract CCIPReceiverBasic is CCIPClientBase, IAny2EVMMessageReceiver, IERC165 { - constructor(address router) CCIPClientBase(router) {} +contract CCIPReceiverBasic is CCIPBase, IAny2EVMMessageReceiver, IERC165 { + constructor(address router) CCIPBase(router) {} function typeAndVersion() external pure virtual returns (string memory) { return "CCIPReceiverBasic 1.0.0-dev"; From 63b76e4e07db799139094b26f316b81bc53263aa 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, 8 Jul 2024 19:00:30 +0000 Subject: [PATCH 32/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 911 +++++++++++-- .../generated/ccipReceiver/ccipReceiver.go | 1145 +++++++++++++---- .../ccip/generated/ccipSender/ccipSender.go | 1105 +++++++++++++--- .../ping_pong_demo/ping_pong_demo.go | 893 +++++++++++-- .../self_funded_ping_pong.go | 893 +++++++++++-- ...rapper-dependency-versions-do-not-edit.txt | 12 +- 6 files changed, 4221 insertions(+), 738 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 46b239bdb2..e0381ce5fc 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -30,11 +30,18 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseApprovedSenderUpdate struct { +type CCIPBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -49,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620045603803806200456083398101604081905262000034916200055f565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200013b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013157620001316001600160a01b03821683600019620001e6565b5050505062000684565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000238573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025e91906200059e565b6200026a9190620005b8565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002c691869190620002cc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031b906001600160a01b038516908490620003a2565b8051909150156200039d57808060200190518101906200033c9190620005e0565b6200039d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003b38484600085620003bb565b949350505050565b6060824710156200041e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200043c919062000631565b60006040518083038185875af1925050503d80600081146200047b576040519150601f19603f3d011682016040523d82523d6000602084013e62000480565b606091505b50909250905062000494878383876200049f565b979650505050505050565b60608315620005135782516000036200050b576001600160a01b0385163b6200050b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003b3565b620003b383838151156200052a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200064f565b6001600160a01b03811681146200055c57600080fd5b50565b600080604083850312156200057357600080fd5b8251620005808162000546565b6020840151909250620005938162000546565b809150509250929050565b600060208284031215620005b157600080fd5b5051919050565b80820180821115620005da57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f357600080fd5b815180151581146200060457600080fd5b9392505050565b60005b83811015620006285781810151838201526020016200060e565b50506000910152565b60008251620006458184602087016200060b565b9190910192915050565b6020815260008251806020840152620006708160408501602087016200060b565b601f01601f19169190910160400192915050565b608051613e88620006d86000396000818161047a015281816105d4015281816106640152818161111501528181611bdb01528181611ca401528181611d7c015281816125fc01526126c80152613e886000f3fe6080604052600436106101845760003560e01c80636fef519e116100d6578063cf6730f81161007f578063e89b448511610059578063e89b4485146104fe578063f2fde38b14610511578063ff2deec31461053157600080fd5b8063cf6730f81461049e578063d8469e40146104be578063e4ca8754146104de57600080fd5b806385572ffb116100b057806385572ffb146103ff5780638da5cb5b1461041f578063b0f479a11461046b57600080fd5b80636fef519e1461038157806379ba5097146103ca5780638462a2b9146103df57600080fd5b806341eade46116101385780635e35359e116101125780635e35359e146103145780636939cd97146103345780636d62d6331461036157600080fd5b806341eade46146102a65780635075a9d4146102c6578063536c6bfa146102f457600080fd5b806311e85dff1161016957806311e85dff14610206578063181f5a771461022857806335f170ef1461027757600080fd5b806305bfe982146101905780630e958d6b146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab366004612d3c565b60086020526000908152604090205460ff1681565b6040516101cd9190612d84565b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612e24565b61055e565b60405190151581526020016101cd565b34801561021257600080fd5b50610226610221366004612e9b565b6105a9565b005b34801561023457600080fd5b5060408051808201909152601481527f43434950436c69656e7420312e302e302d64657600000000000000000000000060208201525b6040516101cd9190612f26565b34801561028357600080fd5b50610297610292366004612f39565b610721565b6040516101cd93929190612f56565b3480156102b257600080fd5b506102266102c1366004612f39565b610858565b3480156102d257600080fd5b506102e66102e1366004612d3c565b6108a3565b6040519081526020016101cd565b34801561030057600080fd5b5061022661030f366004612f8d565b6108b6565b34801561032057600080fd5b5061022661032f366004612fb9565b6108cc565b34801561034057600080fd5b5061035461034f366004612d3c565b6108fa565b6040516101cd9190613057565b34801561036d57600080fd5b5061022661037c3660046130f4565b610b05565b34801561038d57600080fd5b5061026a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156103d657600080fd5b50610226610e1f565b3480156103eb57600080fd5b506102266103fa366004613169565b610f1c565b34801561040b57600080fd5b5061022661041a3660046131d5565b6110fd565b34801561042b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561047757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610446565b3480156104aa57600080fd5b506102266104b93660046131d5565b6113f8565b3480156104ca57600080fd5b506102266104d9366004613210565b611615565b3480156104ea57600080fd5b506102266104f9366004612d3c565b611696565b6102e661050c3660046133f9565b611900565b34801561051d57600080fd5b5061022661052c366004612e9b565b611e84565b34801561053d57600080fd5b506007546104469073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061058d9085908590613506565b9081526040519081900360200190205460ff1690509392505050565b6105b1611e98565b60075473ffffffffffffffffffffffffffffffffffffffff1615610614576106147f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000611f1b565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106c3576106c37f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61211b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6002602052600090815260409020805460018201805460ff909216929161074790613516565b80601f016020809104026020016040519081016040528092919081815260200182805461077390613516565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050908060020180546107d590613516565b80601f016020809104026020016040519081016040528092919081815260200182805461080190613516565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905083565b610860611e98565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006108b060048361221f565b92915050565b6108be611e98565b6108c88282612232565b5050565b6108d4611e98565b6108f573ffffffffffffffffffffffffffffffffffffffff8416838361238c565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161096990613516565b80601f016020809104026020016040519081016040528092919081815260200182805461099590613516565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081526020016003820180546109fb90613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790613516565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610af75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610aa2565b505050915250909392505050565b610b0d611e98565b6001610b1a60048461221f565b14610b59576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610b698260025b600491906123e2565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610bb190613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90613516565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b50505050508152602001600382018054610c4390613516565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613516565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d3f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cea565b5050505081525050905060005b816080015151811015610dce57610dc68383608001518381518110610d7357610d73613569565b60200260200101516020015184608001518481518110610d9557610d95613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661238c9092919063ffffffff16565b600101610d4c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b50565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f24611e98565b60005b818110156110075760026000848484818110610f4557610f45613569565b9050602002810190610f579190613598565b610f65906020810190612f39565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610f9c57610f9c613569565b9050602002810190610fae9190613598565b610fbc9060208101906135d6565b604051610fca929190613506565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610f27565b5060005b838110156110f65760016002600087878581811061102b5761102b613569565b905060200281019061103d9190613598565b61104b906020810190612f39565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061108257611082613569565b90506020028101906110949190613598565b6110a29060208101906135d6565b6040516110b0929190613506565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161100b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461116e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b50565b61117e6040820160208301612f39565b61118b60408301836135d6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111e9925084915061363b565b9081526040519081900360200190205460ff1661123457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b509190612f26565b6112446040840160208501612f39565b67ffffffffffffffff8116600090815260026020526040902060018101805461126c90613516565b1590508061127b5750805460ff165b156112be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112fa90889060040161374f565b600060405180830381600087803b15801561131457600080fd5b505af1925050508015611325575060015b6113c5573d808015611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b5061136586356001610b60565b508535600090815260036020526040902086906113828282613b21565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113b7908490612f26565b60405180910390a2506110f6565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b333014611431576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061144060608301836135d6565b81019061144d9190613c1b565b905060008160400151600181111561146757611467612d55565b03611475576108c8826123f7565b60018160400151600181111561148d5761148d612d55565b036108c85760008082602001518060200190518101906114ad9190613cc7565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b214611545576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526008602052604090205460ff16600281111561156a5761156a612d55565b146115a4576040517f3ec8770000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b61161d611e98565b67ffffffffffffffff85166000908152600260205260409020600181016116458587836138a5565b50811561165d576002810161165b8385836138a5565b505b805460ff161561168e5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016116a360048361221f565b146116dd576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b50565b6116e8816000610b60565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161173090613516565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90613516565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b505050505081526020016003820180546117c290613516565b80601f01602080910402602001604051908101604052809291908181526020018280546117ee90613516565b801561183b5780601f106118105761010080835404028352916020019161183b565b820191906000526020600020905b81548152906001019060200180831161181e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118be5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611869565b505050508152505090506118d1816127a8565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061192c90613516565b1590508061193b5750805460ff165b1561197e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b50565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906119b190613516565b80601f01602080910402602001604051908101604052809291908181526020018280546119dd90613516565b8015611a2a5780601f106119ff57610100808354040283529160200191611a2a565b820191906000526020600020905b815481529060010190602001808311611a0d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611a8990613516565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab590613516565b8015611b025780601f10611ad757610100808354040283529160200191611b02565b820191906000526020600020905b815481529060010190602001808311611ae557829003601f168201915b5050505050815250905060005b8651811015611c6357611b7f3330898481518110611b2f57611b2f613569565b6020026020010151602001518a8581518110611b4d57611b4d613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127b0909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611baf57611baf613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611c5b57611c5b7f0000000000000000000000000000000000000000000000000000000000000000888381518110611c0c57611c0c613569565b602002602001015160200151898481518110611c2a57611c2a613569565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661211b9092919063ffffffff16565b600101611b0f565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90611cdb908b908690600401613d48565b602060405180830381865afa158015611cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1c9190613e0b565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615611d6257600754611d629073ffffffffffffffffffffffffffffffffffffffff163330846127b0565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f9911615611db1576000611db3565b825b8a856040518463ffffffff1660e01b8152600401611dd2929190613d48565b60206040518083038185885af1158015611df0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e159190613e0b565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b611e8c611e98565b611e958161280e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b50565b565b801580611fbb57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613e0b565b155b612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612903565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190613e0b565b6121c09190613e24565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506122199085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612099565b50505050565b600061222b8383612a0f565b9392505050565b8047101561229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122f6576040519150601f19603f3d011682016040523d82523d6000602084013e6122fb565b606091505b50509050806108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b50565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526108f59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612099565b60006123ef848484612a99565b949350505050565b6040805160008082526020820190925281612434565b604080518082019091526000808252602082015281526020019060019003908161240d5790505b50905060006040518060a0016040528084806040019061245491906135d6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124d59288359101613e37565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260075473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600291600091612545918901908901612f39565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201805461257590613516565b80601f01602080910402602001604051908101604052809291908181526020018280546125a190613516565b80156125ee5780601f106125c3576101008083540402835291602001916125ee565b820191906000526020600020905b8154815290600101906020018083116125d157829003601f168201915b5050505050815250905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166320487ded8560200160208101906126499190612f39565b846040518363ffffffff1660e01b8152600401612667929190613d48565b602060405180830381865afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a89190613e0b565b60075490915060009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156126fd5760006126ff565b835b61270f6040890160208a01612f39565b866040518463ffffffff1660e01b815260040161272d929190613d48565b60206040518083038185885af115801561274b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127709190613e0b565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b611e95611e98565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526122199085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612099565b3373ffffffffffffffffffffffffffffffffffffffff82160361288d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b50565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612965826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ab69092919063ffffffff16565b8051909150156108f557808060200190518101906129839190613e59565b6108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b50565b600081815260028301602052604081205480151580612a335750612a338484612ac5565b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b50565b600082815260028401602052604081208290556123ef8484612ad1565b60606123ef8484600085612add565b600061222b8383612bf6565b600061222b8383612c0e565b606082471015612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b50565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b98919061363b565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5091509150612beb87838387612c5d565b979650505050505050565b6000818152600183016020526040812054151561222b565b6000818152600183016020526040812054612c55575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b0565b5060006108b0565b60608315612cf3578251600003612cec5773ffffffffffffffffffffffffffffffffffffffff85163b612cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b50565b50816123ef565b6123ef8383815115612d085781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509190612f26565b600060208284031215612d4e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612dbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e9557600080fd5b60008083601f840112612ded57600080fd5b50813567ffffffffffffffff811115612e0557600080fd5b602083019150836020828501011115612e1d57600080fd5b9250929050565b600080600060408486031215612e3957600080fd5b8335612e4481612dc5565b9250602084013567ffffffffffffffff811115612e6057600080fd5b612e6c86828701612ddb565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e9557600080fd5b600060208284031215612ead57600080fd5b813561222b81612e79565b60005b83811015612ed3578181015183820152602001612ebb565b50506000910152565b60008151808452612ef4816020860160208601612eb8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061222b6020830184612edc565b600060208284031215612f4b57600080fd5b813561222b81612dc5565b8315158152606060208201526000612f716060830185612edc565b8281036040840152612f838185612edc565b9695505050505050565b60008060408385031215612fa057600080fd5b8235612fab81612e79565b946020939093013593505050565b600080600060608486031215612fce57600080fd5b8335612fd981612e79565b92506020840135612fe981612e79565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561304c578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161300f565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261309160c0840182612edc565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130cd8383612edc565b925060808601519150808584030160a0860152506130eb8282612ffa565b95945050505050565b6000806040838503121561310757600080fd5b82359150602083013561311981612e79565b809150509250929050565b60008083601f84011261313657600080fd5b50813567ffffffffffffffff81111561314e57600080fd5b6020830191508360208260051b8501011115612e1d57600080fd5b6000806000806040858703121561317f57600080fd5b843567ffffffffffffffff8082111561319757600080fd5b6131a388838901613124565b909650945060208701359150808211156131bc57600080fd5b506131c987828801613124565b95989497509550505050565b6000602082840312156131e757600080fd5b813567ffffffffffffffff8111156131fe57600080fd5b820160a0818503121561222b57600080fd5b60008060008060006060868803121561322857600080fd5b853561323381612dc5565b9450602086013567ffffffffffffffff8082111561325057600080fd5b61325c89838a01612ddb565b9096509450604088013591508082111561327557600080fd5b5061328288828901612ddb565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156132e5576132e5613293565b60405290565b6040516060810167ffffffffffffffff811182821017156132e5576132e5613293565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561335557613355613293565b604052919050565b600067ffffffffffffffff82111561337757613377613293565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126133b457600080fd5b81356133c76133c28261335d565b61330e565b8181528460208386010111156133dc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561340e57600080fd5b833561341981612dc5565b925060208481013567ffffffffffffffff8082111561343757600080fd5b818701915087601f83011261344b57600080fd5b81358181111561345d5761345d613293565b61346b848260051b0161330e565b81815260069190911b8301840190848101908a83111561348a57600080fd5b938501935b828510156134d6576040858c0312156134a85760008081fd5b6134b06132c2565b85356134bb81612e79565b8152858701358782015282526040909401939085019061348f565b9650505060408701359250808311156134ee57600080fd5b50506134fc868287016133a3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061352a57607f821691505b602082108103613563577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126135cc57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261360b57600080fd5b83018035915067ffffffffffffffff82111561362657600080fd5b602001915036819003821315612e1d57600080fd5b600082516135cc818460208701612eb8565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261368257600080fd5b830160208101925035905067ffffffffffffffff8111156136a257600080fd5b803603821315612e1d57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561304c57813561371d81612e79565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161370a565b60208152813560208201526000602083013561376a81612dc5565b67ffffffffffffffff8082166040850152613788604086018661364d565b925060a0606086015261379f60c0860184836136b1565b9250506137af606086018661364d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526137e58583856136b1565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261381e57600080fd5b6020928801928301923591508382111561383757600080fd5b8160061b360383131561384957600080fd5b8685030160a0870152612beb8482846136fa565b601f8211156108f5576000816000526020600020601f850160051c810160208610156138865750805b601f850160051c820191505b8181101561168e57828155600101613892565b67ffffffffffffffff8311156138bd576138bd613293565b6138d1836138cb8354613516565b8361385d565b6000601f84116001811461392357600085156138ed5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139725786850135825560209485019460019092019101613952565b50868210156139ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356139f981612e79565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613a5f57613a5f613293565b805483825580841015613aec5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613aa057613aa06139bf565b8086168614613ab157613ab16139bf565b5060008360005260206000208360011b81018760011b820191505b80821015613ae7578282558284830155600282019150613acc565b505050505b5060008181526020812083915b8581101561168e57613b0b83836139ee565b6040929092019160029190910190600101613af9565b81358155600181016020830135613b3781612dc5565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613b7760408601866135d6565b93509150613b898383600287016138a5565b613b9660608601866135d6565b93509150613ba88383600387016138a5565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613bdf57600080fd5b918401918235915080821115613bf457600080fd5b506020820191508060061b3603821315613c0d57600080fd5b612219818360048601613a46565b600060208284031215613c2d57600080fd5b813567ffffffffffffffff80821115613c4557600080fd5b9083019060608286031215613c5957600080fd5b613c616132eb565b823582811115613c7057600080fd5b613c7c878286016133a3565b825250602083013582811115613c9157600080fd5b613c9d878286016133a3565b6020830152506040830135925060028310613cb757600080fd5b6040810192909252509392505050565b60008060408385031215613cda57600080fd5b825167ffffffffffffffff811115613cf157600080fd5b8301601f81018513613d0257600080fd5b8051613d106133c28261335d565b818152866020838501011115613d2557600080fd5b613d36826020830160208601612eb8565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613d7460e0840182612edc565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613db08383612edc565b92506040860151915080858403016080860152613dcd8383612ffa565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250612f838282612edc565b600060208284031215613e1d57600080fd5b5051919050565b808201808211156108b0576108b06139bf565b604081526000613e4a6040830185612edc565b90508260208301529392505050565b600060208284031215613e6b57600080fd5b8151801515811461222b57600080fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004ac138038062004ac1833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b614423806200069e6000396000f3fe6080604052600436106101795760003560e01c806379ba5097116100cb578063b0f479a11161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063b0f479a11461043d578063cf6730f814610468578063e4ca87541461048857600080fd5b806385572ffb116100b057806385572ffb146103b15780638da5cb5b146103d15780639fe74e261461041d57600080fd5b806379ba50971461037c5780638462a2b91461039157600080fd5b80635075a9d41161012d5780636939cd97116101075780636939cd97146102d95780636d62d633146103065780636fef519e1461032657600080fd5b80635075a9d41461026b578063536c6bfa146102995780635e35359e146102b957600080fd5b806311e85dff1161015e57806311e85dff146101fb57806335f170ef1461021d5780634e12498b1461024b57600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a036600461328d565b60096020526000908152604090205460ff1681565b6040516101c291906132d5565b60405180910390f35b3480156101d757600080fd5b506101eb6101e636600461332c565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b6102163660046133d3565b610553565b005b34801561022957600080fd5b5061023d6102383660046133f0565b6106c7565b6040516101c292919061347b565b34801561025757600080fd5b5061021b6102663660046133d3565b6107f3565b34801561027757600080fd5b5061028b61028636600461328d565b6108bf565b6040519081526020016101c2565b3480156102a557600080fd5b5061021b6102b43660046134a9565b6108d2565b3480156102c557600080fd5b5061021b6102d43660046134d5565b610936565b3480156102e557600080fd5b506102f96102f436600461328d565b6109cb565b6040516101c29190613573565b34801561031257600080fd5b5061021b610321366004613607565b610bd6565b34801561033257600080fd5b5061036f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c29190613637565b34801561038857600080fd5b5061021b610ef0565b34801561039d57600080fd5b5061021b6103ac366004613696565b610fed565b3480156103bd57600080fd5b5061021b6103cc366004613702565b61134e565b3480156103dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561042957600080fd5b5061021b61043836600461373d565b61165b565b34801561044957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103f8565b34801561047457600080fd5b5061021b610483366004613702565b6119db565b34801561049457600080fd5b5061021b6104a336600461328d565b611c22565b61028b6104b63660046138e5565b611e8c565b3480156104c757600080fd5b5061021b6104d63660046133d3565b6123c2565b3480156104e757600080fd5b506008546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061053790859085906139f2565b9081526040519081900360200190205460ff1690509392505050565b61055b6123d6565b60085473ffffffffffffffffffffffffffffffffffffffff16156105bc576105bc61059b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612459565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106695761066961062960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612659565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6003602052600090815260409020805481906106e290613a02565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90613a02565b801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b50505050509080600101805461077090613a02565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613a02565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905082565b6107fb6123d6565b73ffffffffffffffffffffffffffffffffffffffff8116610848576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006108cc60058361275d565b92915050565b6108da6123d6565b6108e48282612770565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61093e6123d6565b61095f73ffffffffffffffffffffffffffffffffffffffff841683836128ca565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109be91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a3a90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690613a02565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600382018054610acc90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890613a02565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bc85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b73565b505050915250909392505050565b610bde6123d6565b6001610beb60058461275d565b14610c2a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c3a8260025b60059190612920565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c8290613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae90613a02565b8015610cfb5780601f10610cd057610100808354040283529160200191610cfb565b820191906000526020600020905b815481529060010190602001808311610cde57829003601f168201915b50505050508152602001600382018054610d1490613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090613a02565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dbb565b5050505081525050905060005b816080015151811015610e9f57610e978383608001518381518110610e4457610e44613a55565b60200260200101516020015184608001518481518110610e6657610e66613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128ca9092919063ffffffff16565b600101610e1d565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c21565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ff56123d6565b60005b81811015611198576003600084848481811061101657611016613a55565b90506020028101906110289190613a84565b6110369060208101906133f0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061106d5761106d613a55565b905060200281019061107f9190613a84565b61108d906020810190613ac2565b60405161109b9291906139f2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110e2576110e2613a55565b90506020028101906110f49190613a84565b611102906020810190613ac2565b6040516111109291906139f2565b604051809103902083838381811061112a5761112a613a55565b905060200281019061113c9190613a84565b61114a9060208101906133f0565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611188911515815260200190565b60405180910390a3600101610ff8565b5060005b83811015611347576001600360008787858181106111bc576111bc613a55565b90506020028101906111ce9190613a84565b6111dc9060208101906133f0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061121357611213613a55565b90506020028101906112259190613a84565b611233906020810190613ac2565b6040516112419291906139f2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061129157611291613a55565b90506020028101906112a39190613a84565b6112b1906020810190613ac2565b6040516112bf9291906139f2565b60405180910390208585838181106112d9576112d9613a55565b90506020028101906112eb9190613a84565b6112f99060208101906133f0565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611337911515815260200190565b60405180910390a360010161119c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113a1576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c21565b6113b160408201602083016133f0565b6113be6040830183613ac2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061141592509050613a02565b1590508061146b5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516114569190613b27565b9081526040519081900360200190205460ff16155b156114a457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c219190613637565b6114b460408401602085016133f0565b67ffffffffffffffff81166000908152600360205260409020805481906114da90613a02565b9050600003611521576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061155d908890600401613c3b565b600060405180830381600087803b15801561157757600080fd5b505af1925050508015611588575060015b611628573d8080156115b6576040519150601f19603f3d011682016040523d82523d6000602084013e6115bb565b606091505b506115c886356001610c31565b508535600090815260046020526040902086906115e58282614015565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061161a908490613637565b60405180910390a250611347565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6116636123d6565b60005b818110156119d65782828281811061168057611680613a55565b9050602002810190611692919061410f565b6116a3906040810190602001614151565b61177657600360008484848181106116bd576116bd613a55565b90506020028101906116cf919061410f565b6116dd9060208101906133f0565b67ffffffffffffffff168152602081019190915260400160009081206117029161323f565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991683838381811061173557611735613a55565b9050602002810190611747919061410f565b6117559060208101906133f0565b60405167ffffffffffffffff909116815260200160405180910390a16119ce565b82828281811061178857611788613a55565b905060200281019061179a919061410f565b6117a8906040810190613ac2565b90506000036117e3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106117fb576117fb613a55565b905060200281019061180d919061410f565b61181b9060208101906133f0565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061185157611851613a55565b9050602002810190611863919061410f565b611871906040810190613ac2565b829161187e919083613d99565b5083838381811061189157611891613a55565b90506020028101906118a3919061410f565b6118b1906060810190613ac2565b1590506118fc578383838181106118ca576118ca613a55565b90506020028101906118dc919061410f565b6118ea906060810190613ac2565b60018301916118fa919083613d99565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284848481811061192f5761192f613a55565b9050602002810190611941919061410f565b61194f9060208101906133f0565b85858581811061196157611961613a55565b9050602002810190611973919061410f565b611981906040810190613ac2565b87878781811061199357611993613a55565b90506020028101906119a5919061410f565b6119b3906060810190613ac2565b6040516119c495949392919061416e565b60405180910390a1505b600101611666565b505050565b333014611a14576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a236060830183613ac2565b810190611a3091906141b1565b9050600081604001516001811115611a4a57611a4a6132a6565b03611a5c57611a5882612935565b5050565b600181604001516001811115611a7457611a746132a6565b03611a58576000808260200151806020019051810190611a94919061425d565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611ade9190613637565b6040516020818303038152906040528051906020012082604051602001611b059190613637565b6040516020818303038152906040528051906020012014611b52576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526009602052604090205460ff166002811115611b7757611b776132a6565b03611bb1576040517f33704b2800000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b6001611c2f60058361275d565b14611c69576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b611c74816000610c31565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cbc90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce890613a02565b8015611d355780601f10611d0a57610100808354040283529160200191611d35565b820191906000526020600020905b815481529060010190602001808311611d1857829003601f168201915b50505050508152602001600382018054611d4e90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7a90613a02565b8015611dc75780601f10611d9c57610100808354040283529160200191611dc7565b820191906000526020600020905b815481529060010190602001808311611daa57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e4a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611df5565b50505050815250509050611e5d81612cab565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611eb590613a02565b9050600003611efc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f2c90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5890613a02565b8015611fa55780601f10611f7a57610100808354040283529160200191611fa5565b820191906000526020600020905b815481529060010190602001808311611f8857829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161200690613a02565b80601f016020809104026020016040519081016040528092919081815260200182805461203290613a02565b801561207f5780601f106120545761010080835404028352916020019161207f565b820191906000526020600020905b81548152906001019060200180831161206257829003601f168201915b5050505050815250905060005b86518110156121dc576120fc33308984815181106120ac576120ac613a55565b6020026020010151602001518a85815181106120ca576120ca613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612cb3909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061212c5761212c613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121d45760025487516121d49173ffffffffffffffffffffffffffffffffffffffff169089908490811061218557612185613a55565b6020026020010151602001518984815181106121a3576121a3613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124599092919063ffffffff16565b60010161208c565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612236908b9086906004016142de565b602060405180830381865afa158015612253573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227791906143ab565b60085490915073ffffffffffffffffffffffffffffffffffffffff16156122bd576008546122bd9073ffffffffffffffffffffffffffffffffffffffff16333084612cb3565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156122ef5760006122f1565b825b8a856040518463ffffffff1660e01b81526004016123109291906142de565b60206040518083038185885af115801561232e573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061235391906143ab565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6123ca6123d6565b6123d381612d11565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c21565b565b8015806124f957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906143ab565b155b612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119d69084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e06565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f491906143ab565b6126fe91906143c4565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506127579085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125d7565b50505050565b60006127698383612f12565b9392505050565b804710156127da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c21565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612834576040519150601f19603f3d011682016040523d82523d6000602084013e612839565b606091505b50509050806119d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119d69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125d7565b600061292d848484612f9c565b949350505050565b6040805160008082526020820190925281612972565b604080518082019091526000808252602082015281526020019060019003908161294b5790505b50905060006040518060a001604052808480604001906129929190613ac2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612a1392883591016143d7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612a839189019089016133f0565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612ab390613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054612adf90613a02565b8015612b2c5780601f10612b0157610100808354040283529160200191612b2c565b820191906000526020600020905b815481529060010190602001808311612b0f57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612b6960408701602088016133f0565b846040518363ffffffff1660e01b8152600401612b879291906142de565b602060405180830381865afa158015612ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc891906143ab565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612c00576000612c02565b835b612c126040890160208a016133f0565b866040518463ffffffff1660e01b8152600401612c309291906142de565b60206040518083038185885af1158015612c4e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c7391906143ab565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b6123d36123d6565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526127579085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016125d7565b3373ffffffffffffffffffffffffffffffffffffffff821603612d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c21565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612e68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fb99092919063ffffffff16565b8051909150156119d65780806020019051810190612e8691906143f9565b6119d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c21565b600081815260028301602052604081205480151580612f365750612f368484612fc8565b612769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c21565b6000828152600284016020526040812082905561292d8484612fd4565b606061292d8484600085612fe0565b600061276983836130f9565b60006127698383613111565b606082471015613072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c21565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161309b9190613b27565b60006040518083038185875af1925050503d80600081146130d8576040519150601f19603f3d011682016040523d82523d6000602084013e6130dd565b606091505b50915091506130ee87838387613160565b979650505050505050565b60008181526001830160205260408120541515612769565b6000818152600183016020526040812054613158575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108cc565b5060006108cc565b606083156131f65782516000036131ef5773ffffffffffffffffffffffffffffffffffffffff85163b6131ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c21565b508161292d565b61292d838381511561320b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c219190613637565b50805461324b90613a02565b6000825580601f1061325b575050565b601f0160209004906000526020600020908101906123d391905b808211156132895760008155600101613275565b5090565b60006020828403121561329f57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613310577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146123d357600080fd5b60008060006040848603121561334157600080fd5b833561334c81613316565b9250602084013567ffffffffffffffff8082111561336957600080fd5b818601915086601f83011261337d57600080fd5b81358181111561338c57600080fd5b87602082850101111561339e57600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146123d357600080fd5b6000602082840312156133e557600080fd5b8135612769816133b1565b60006020828403121561340257600080fd5b813561276981613316565b60005b83811015613428578181015183820152602001613410565b50506000910152565b6000815180845261344981602086016020860161340d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061348e6040830185613431565b82810360208401526134a08185613431565b95945050505050565b600080604083850312156134bc57600080fd5b82356134c7816133b1565b946020939093013593505050565b6000806000606084860312156134ea57600080fd5b83356134f5816133b1565b92506020840135613505816133b1565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613568578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161352b565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135ad60c0840182613431565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526135e98383613431565b925060808601519150808584030160a0860152506134a08282613516565b6000806040838503121561361a57600080fd5b82359150602083013561362c816133b1565b809150509250929050565b6020815260006127696020830184613431565b60008083601f84011261365c57600080fd5b50813567ffffffffffffffff81111561367457600080fd5b6020830191508360208260051b850101111561368f57600080fd5b9250929050565b600080600080604085870312156136ac57600080fd5b843567ffffffffffffffff808211156136c457600080fd5b6136d08883890161364a565b909650945060208701359150808211156136e957600080fd5b506136f68782880161364a565b95989497509550505050565b60006020828403121561371457600080fd5b813567ffffffffffffffff81111561372b57600080fd5b820160a0818503121561276957600080fd5b6000806020838503121561375057600080fd5b823567ffffffffffffffff81111561376757600080fd5b6137738582860161364a565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156137d1576137d161377f565b60405290565b6040516060810167ffffffffffffffff811182821017156137d1576137d161377f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138415761384161377f565b604052919050565b600067ffffffffffffffff8211156138635761386361377f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126138a057600080fd5b81356138b36138ae82613849565b6137fa565b8181528460208386010111156138c857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156138fa57600080fd5b833561390581613316565b925060208481013567ffffffffffffffff8082111561392357600080fd5b818701915087601f83011261393757600080fd5b8135818111156139495761394961377f565b613957848260051b016137fa565b81815260069190911b8301840190848101908a83111561397657600080fd5b938501935b828510156139c2576040858c0312156139945760008081fd5b61399c6137ae565b85356139a7816133b1565b8152858701358782015282526040909401939085019061397b565b9650505060408701359250808311156139da57600080fd5b50506139e88682870161388f565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a1657607f821691505b602082108103613a4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613ab857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613af757600080fd5b83018035915067ffffffffffffffff821115613b1257600080fd5b60200191503681900382131561368f57600080fd5b60008251613ab881846020870161340d565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b6e57600080fd5b830160208101925035905067ffffffffffffffff811115613b8e57600080fd5b80360382131561368f57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613568578135613c09816133b1565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613bf6565b602081528135602082015260006020830135613c5681613316565b67ffffffffffffffff8082166040850152613c746040860186613b39565b925060a06060860152613c8b60c086018483613b9d565b925050613c9b6060860186613b39565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613cd1858385613b9d565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613d0a57600080fd5b60209288019283019235915083821115613d2357600080fd5b8160061b3603831315613d3557600080fd5b8685030160a08701526130ee848284613be6565b601f8211156119d6576000816000526020600020601f850160051c81016020861015613d725750805b601f850160051c820191505b81811015613d9157828155600101613d7e565b505050505050565b67ffffffffffffffff831115613db157613db161377f565b613dc583613dbf8354613a02565b83613d49565b6000601f841160018114613e175760008515613de15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611347565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613e665786850135825560209485019460019092019101613e46565b5086821015613ea1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613eed816133b1565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613f5357613f5361377f565b805483825580841015613fe05760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613f9457613f94613eb3565b8086168614613fa557613fa5613eb3565b5060008360005260206000208360011b81018760011b820191505b80821015613fdb578282558284830155600282019150613fc0565b505050505b5060008181526020812083915b85811015613d9157613fff8383613ee2565b6040929092019160029190910190600101613fed565b8135815560018101602083013561402b81613316565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561406b6040860186613ac2565b9350915061407d838360028701613d99565b61408a6060860186613ac2565b9350915061409c838360038701613d99565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126140d357600080fd5b9184019182359150808211156140e857600080fd5b506020820191508060061b360382131561410157600080fd5b612757818360048601613f3a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ab857600080fd5b80151581146123d357600080fd5b60006020828403121561416357600080fd5b813561276981614143565b67ffffffffffffffff86168152606060208201526000614192606083018688613b9d565b82810360408401526141a5818587613b9d565b98975050505050505050565b6000602082840312156141c357600080fd5b813567ffffffffffffffff808211156141db57600080fd5b90830190606082860312156141ef57600080fd5b6141f76137d7565b82358281111561420657600080fd5b6142128782860161388f565b82525060208301358281111561422757600080fd5b6142338782860161388f565b602083015250604083013592506002831061424d57600080fd5b6040810192909252509392505050565b6000806040838503121561427057600080fd5b825167ffffffffffffffff81111561428757600080fd5b8301601f8101851361429857600080fd5b80516142a66138ae82613849565b8181528660208385010111156142bb57600080fd5b6142cc82602083016020860161340d565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a0604084015261430a60e0840182613431565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526143468383613431565b925060408601519150808584030160808601526143638383613516565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143a18282613431565b9695505050505050565b6000602082840312156143bd57600080fd5b5051919050565b808201808211156108cc576108cc613eb3565b6040815260006143ea6040830185613431565b90508260208301529392505050565b60006020828403121561440b57600080fd5b81516127698161414356fea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -189,25 +196,25 @@ func (_CCIPClient *CCIPClientTransactorRaw) Transact(opts *bind.TransactOpts, me return _CCIPClient.Contract.contract.Transact(opts, method, params...) } -func (_CCIPClient *CCIPClientCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) { +func (_CCIPClient *CCIPClientCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { var out []interface{} err := _CCIPClient.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { - return *new([]byte), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -func (_CCIPClient *CCIPClientSession) ACKMESSAGEHEADER() ([]byte, error) { +func (_CCIPClient *CCIPClientSession) ACKMESSAGEHEADER() (string, error) { return _CCIPClient.Contract.ACKMESSAGEHEADER(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCallerSession) ACKMESSAGEHEADER() ([]byte, error) { +func (_CCIPClient *CCIPClientCallerSession) ACKMESSAGEHEADER() (string, error) { return _CCIPClient.Contract.ACKMESSAGEHEADER(&_CCIPClient.CallOpts) } @@ -332,9 +339,8 @@ func (_CCIPClient *CCIPClientCaller) SChainConfigs(opts *bind.CallOpts, destChai return *outstruct, err } - 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) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) return *outstruct, err @@ -396,28 +402,6 @@ func (_CCIPClient *CCIPClientCallerSession) SMessageStatus(messageId [32]byte) ( 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) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -442,6 +426,18 @@ func (_CCIPClient *CCIPClientTransactorSession) AcceptOwnership() (*types.Transa return _CCIPClient.Contract.AcceptOwnership(&_CCIPClient.TransactOpts) } +func (_CCIPClient *CCIPClientTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "applyChainUpdates", chains) +} + +func (_CCIPClient *CCIPClientSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPClient.Contract.ApplyChainUpdates(&_CCIPClient.TransactOpts, chains) +} + +func (_CCIPClient *CCIPClientTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPClient.Contract.ApplyChainUpdates(&_CCIPClient.TransactOpts, chains) +} + func (_CCIPClient *CCIPClientTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "ccipReceive", message) } @@ -466,30 +462,6 @@ func (_CCIPClient *CCIPClientTransactorSession) CcipSend(destChainSelector uint6 return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data) } -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) } @@ -502,6 +474,18 @@ func (_CCIPClient *CCIPClientTransactorSession) ModifyFeeToken(token common.Addr return _CCIPClient.Contract.ModifyFeeToken(&_CCIPClient.TransactOpts, token) } +func (_CCIPClient *CCIPClientTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "modifyRouter", newRouter) +} + +func (_CCIPClient *CCIPClientSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.ModifyRouter(&_CCIPClient.TransactOpts, newRouter) +} + +func (_CCIPClient *CCIPClientTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.ModifyRouter(&_CCIPClient.TransactOpts, newRouter) +} + func (_CCIPClient *CCIPClientTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "processMessage", message) } @@ -514,76 +498,585 @@ 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) (*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) 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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) +} + +func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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) 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 CCIPClientApprovedSenderModifiedIterator struct { + Event *CCIPClientApprovedSenderModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientApprovedSenderModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientApprovedSenderModified) + 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(CCIPClientApprovedSenderModified) + 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 *CCIPClientApprovedSenderModifiedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientApprovedSenderModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientApprovedSenderModified struct { + DestChainSelector uint64 + Recipient common.Hash + IsBeingApproved bool + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderModifiedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &CCIPClientApprovedSenderModifiedIterator{contract: _CCIPClient.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientApprovedSenderModified) + if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderModified", 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) ParseApprovedSenderModified(log types.Log) (*CCIPClientApprovedSenderModified, error) { + event := new(CCIPClientApprovedSenderModified) + if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientCCIPRouterModifiedIterator struct { + Event *CCIPClientCCIPRouterModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientCCIPRouterModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientCCIPRouterModified) + 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(CCIPClientCCIPRouterModified) + 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 *CCIPClientCCIPRouterModifiedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientCCIPRouterModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientCCIPRouterModifiedIterator, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return &CCIPClientCCIPRouterModifiedIterator{contract: _CCIPClient.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPClientCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientCCIPRouterModified) + if err := _CCIPClient.contract.UnpackLog(event, "CCIPRouterModified", 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) ParseCCIPRouterModified(log types.Log) (*CCIPClientCCIPRouterModified, error) { + event := new(CCIPClientCCIPRouterModified) + if err := _CCIPClient.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientChainAddedIterator struct { + Event *CCIPClientChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientChainAdded) + 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(CCIPClientChainAdded) + 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 *CCIPClientChainAddedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientChainAdded struct { + RemoteChainSelector uint64 + Recipient []byte + ExtraArgsBytes []byte + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterChainAdded(opts *bind.FilterOpts) (*CCIPClientChainAddedIterator, error) { + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &CCIPClientChainAddedIterator{contract: _CCIPClient.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded) (event.Subscription, error) { + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientChainAdded) + if err := _CCIPClient.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPClient *CCIPClientFilterer) ParseChainAdded(log types.Log) (*CCIPClientChainAdded, error) { + event := new(CCIPClientChainAdded) + if err := _CCIPClient.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientChainRemovedIterator struct { + Event *CCIPClientChainRemoved -func (_CCIPClient *CCIPClientSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) -} + contract *bind.BoundContract + event string -func (_CCIPClient *CCIPClientTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPClient.Contract.RetryFailedMessage(&_CCIPClient.TransactOpts, messageId) + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -func (_CCIPClient *CCIPClientTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "transferOwnership", to) -} +func (it *CCIPClientChainRemovedIterator) Next() bool { -func (_CCIPClient *CCIPClientSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.TransferOwnership(&_CCIPClient.TransactOpts, to) -} + if it.fail != nil { + return false + } -func (_CCIPClient *CCIPClientTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.TransferOwnership(&_CCIPClient.TransactOpts, to) -} + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true -func (_CCIPClient *CCIPClientTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "updateApprovedSenders", adds, removes) -} + default: + return false + } + } -func (_CCIPClient *CCIPClientSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) -} + select { + case log := <-it.logs: + it.Event = new(CCIPClientChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true -func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -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 (it *CCIPClientChainRemovedIterator) Error() error { + return it.fail } -func (_CCIPClient *CCIPClientSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPClient.Contract.WithdrawNativeToken(&_CCIPClient.TransactOpts, to, amount) +func (it *CCIPClientChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil } -func (_CCIPClient *CCIPClientTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPClient.Contract.WithdrawNativeToken(&_CCIPClient.TransactOpts, to, amount) +type CCIPClientChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log } -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 *CCIPClientFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*CCIPClientChainRemovedIterator, error) { -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) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &CCIPClientChainRemovedIterator{contract: _CCIPClient.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -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 *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved) (event.Subscription, error) { -func (_CCIPClient *CCIPClientTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CCIPClient.contract.RawTransact(opts, nil) -} + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: -func (_CCIPClient *CCIPClientSession) Receive() (*types.Transaction, error) { - return _CCIPClient.Contract.Receive(&_CCIPClient.TransactOpts) + event := new(CCIPClientChainRemoved) + if err := _CCIPClient.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil } -func (_CCIPClient *CCIPClientTransactorSession) Receive() (*types.Transaction, error) { - return _CCIPClient.Contract.Receive(&_CCIPClient.TransactOpts) +func (_CCIPClient *CCIPClientFilterer) ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, error) { + event := new(CCIPClientChainRemoved) + if err := _CCIPClient.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil } type CCIPClientFeeTokenModifiedIterator struct { @@ -1874,14 +2367,158 @@ func (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferred(log types.Log) return event, nil } +type CCIPClientTokensWithdrawnByOwnerIterator struct { + Event *CCIPClientTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientTokensWithdrawnByOwner) + 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(CCIPClientTokensWithdrawnByOwner) + 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 *CCIPClientTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *CCIPClientTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &CCIPClientTokensWithdrawnByOwnerIterator{contract: _CCIPClient.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(CCIPClientTokensWithdrawnByOwner) + if err := _CCIPClient.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*CCIPClientTokensWithdrawnByOwner, error) { + event := new(CCIPClientTokensWithdrawnByOwner) + if err := _CCIPClient.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type SChainConfigs struct { - Disabled bool Recipient []byte ExtraArgsBytes []byte } func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _CCIPClient.abi.Events["ApprovedSenderModified"].ID: + return _CCIPClient.ParseApprovedSenderModified(log) + case _CCIPClient.abi.Events["CCIPRouterModified"].ID: + return _CCIPClient.ParseCCIPRouterModified(log) + case _CCIPClient.abi.Events["ChainAdded"].ID: + return _CCIPClient.ParseChainAdded(log) + case _CCIPClient.abi.Events["ChainRemoved"].ID: + return _CCIPClient.ParseChainRemoved(log) case _CCIPClient.abi.Events["FeeTokenModified"].ID: return _CCIPClient.ParseFeeTokenModified(log) case _CCIPClient.abi.Events["MessageAbandoned"].ID: @@ -1902,12 +2539,30 @@ func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, err return _CCIPClient.ParseOwnershipTransferRequested(log) case _CCIPClient.abi.Events["OwnershipTransferred"].ID: return _CCIPClient.ParseOwnershipTransferred(log) + case _CCIPClient.abi.Events["TokensWithdrawnByOwner"].ID: + return _CCIPClient.ParseTokensWithdrawnByOwner(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) } } +func (CCIPClientApprovedSenderModified) Topic() common.Hash { + return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +} + +func (CCIPClientCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (CCIPClientChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (CCIPClientChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + func (CCIPClientFeeTokenModified) Topic() common.Hash { return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") } @@ -1948,12 +2603,16 @@ func (CCIPClientOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (CCIPClientTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + func (_CCIPClient *CCIPClient) Address() common.Address { return _CCIPClient.address } type CCIPClientInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) @@ -1973,29 +2632,27 @@ type CCIPClientInterface interface { SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) - AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*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) - - EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) - ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2003,6 +2660,30 @@ type CCIPClientInterface interface { Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderModifiedIterator, error) + + WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderModified(log types.Log) (*CCIPClientApprovedSenderModified, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPClientCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*CCIPClientCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts) (*CCIPClientChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*CCIPClientChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*CCIPClientChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, 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) @@ -2063,6 +2744,12 @@ type CCIPClientInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPClientOwnershipTransferred, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientTokensWithdrawnByOwnerIterator, error) + + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokensWithdrawnByOwner(log types.Log) (*CCIPClientTokensWithdrawnByOwner, 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 index fd5ede0f3e..5853da23fb 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -30,11 +30,18 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseApprovedSenderUpdate struct { +type CCIPBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -49,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPReceiverMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002a8738038062002a878339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b60805161288a620001fd600039600081816103760152610e59015261288a6000f3fe60806040526004361061012d5760003560e01c806379ba5097116100a5578063b0f479a111610074578063d8469e4011610059578063d8469e40146103ba578063e4ca8754146103da578063f2fde38b146103fa57600080fd5b8063b0f479a114610367578063cf6730f81461039a57600080fd5b806379ba5097146102c65780638462a2b9146102db57806385572ffb146102fb5780638da5cb5b1461031b57600080fd5b80635075a9d4116100fc5780635e35359e116100e15780635e35359e146102595780636939cd97146102795780636d62d633146102a657600080fd5b80635075a9d41461020b578063536c6bfa1461023957600080fd5b80630e958d6b14610139578063181f5a771461016e57806335f170ef146101ba57806341eade46146101e957600080fd5b3661013457005b600080fd5b34801561014557600080fd5b50610159610154366004611c99565b61041a565b60405190151581526020015b60405180910390f35b34801561017a57600080fd5b50604080518082018252601681527f43434950526563656976657220312e302e302d64657600000000000000000000602082015290516101659190611d5c565b3480156101c657600080fd5b506101da6101d5366004611d6f565b610465565b60405161016593929190611d8c565b3480156101f557600080fd5b50610209610204366004611d6f565b61059c565b005b34801561021757600080fd5b5061022b610226366004611dc3565b6105e7565b604051908152602001610165565b34801561024557600080fd5b50610209610254366004611dfe565b6105fa565b34801561026557600080fd5b50610209610274366004611e2a565b610610565b34801561028557600080fd5b50610299610294366004611dc3565b61063e565b6040516101659190611e6b565b3480156102b257600080fd5b506102096102c1366004611f52565b610849565b3480156102d257600080fd5b50610209610b63565b3480156102e757600080fd5b506102096102f6366004611fc7565b610c60565b34801561030757600080fd5b50610209610316366004612033565b610e41565b34801561032757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610165565b34801561037357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610342565b3480156103a657600080fd5b506102096103b5366004612033565b611074565b3480156103c657600080fd5b506102096103d536600461206e565b611173565b3480156103e657600080fd5b506102096103f5366004611dc3565b6111f4565b34801561040657600080fd5b506102096104153660046120f1565b61145e565b67ffffffffffffffff83166000908152600260205260408082209051600390910190610449908590859061210e565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161048b9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b79061211e565b80156105045780601f106104d957610100808354040283529160200191610504565b820191906000526020600020905b8154815290600101906020018083116104e757829003601f168201915b5050505050908060020180546105199061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546105459061211e565b80156105925780601f1061056757610100808354040283529160200191610592565b820191906000526020600020905b81548152906001019060200180831161057557829003601f168201915b5050505050905083565b6105a4611472565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f46004836114f5565b92915050565b610602611472565b61060c8282611508565b5050565b610618611472565b61063973ffffffffffffffffffffffffffffffffffffffff84168383611662565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ad9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546106d99061211e565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050815260200160038201805461073f9061211e565b80601f016020809104026020016040519081016040528092919081815260200182805461076b9061211e565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561083b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107e6565b505050915250909392505050565b610851611472565b600161085e6004846114f5565b1461089d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6108ad8260025b600491906116ef565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108f59061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546109219061211e565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b505050505081526020016003820180546109879061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546109b39061211e565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a835760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a2e565b5050505081525050905060005b816080015151811015610b1257610b0a8383608001518381518110610ab757610ab7612171565b60200260200101516020015184608001518481518110610ad957610ad9612171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166116629092919063ffffffff16565b600101610a90565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610894565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c68611472565b60005b81811015610d4b5760026000848484818110610c8957610c89612171565b9050602002810190610c9b91906121a0565b610ca9906020810190611d6f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301838383818110610ce057610ce0612171565b9050602002810190610cf291906121a0565b610d009060208101906121de565b604051610d0e92919061210e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610c6b565b5060005b83811015610e3a57600160026000878785818110610d6f57610d6f612171565b9050602002810190610d8191906121a0565b610d8f906020810190611d6f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600301868684818110610dc657610dc6612171565b9050602002810190610dd891906121a0565b610de69060208101906121de565b604051610df492919061210e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101610d4f565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eb2576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610894565b610ec26040820160208301611d6f565b67ffffffffffffffff81166000908152600260205260409020600181018054610eea9061211e565b15905080610ef95750805460ff165b15610f3c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610894565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f78908690600401612350565b600060405180830381600087803b158015610f9257600080fd5b505af1925050508015610fa3575060015b611043573d808015610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50610fe3843560016108a4565b508335600090815260036020526040902084906110008282612749565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611035908490611d5c565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a2505050565b3330146110ad576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110bd6040820160208301611d6f565b6110ca60408301836121de565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506111289250849150612849565b9081526040519081900360200190205460ff1661063957806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108949190611d5c565b61117b611472565b67ffffffffffffffff85166000908152600260205260409020600181016111a38587836124d5565b5081156111bb57600281016111b98385836124d5565b505b805460ff16156111ec5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b60016112016004836114f5565b1461123b576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610894565b6112468160006108a4565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161128e9061211e565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba9061211e565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081526020016003820180546113209061211e565b80601f016020809104026020016040519081016040528092919081815260200182805461134c9061211e565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561141c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016113c7565b5050505081525050905061142f81611704565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611466611472565b61146f8161170c565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610894565b565b60006115018383611801565b9392505050565b80471015611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610894565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146115cc576040519150601f19603f3d011682016040523d82523d6000602084013e6115d1565b606091505b5050905080610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610894565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261063990849061188b565b60006116fc848484611997565b949350505050565b61146f611472565b3373ffffffffffffffffffffffffffffffffffffffff82160361178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610894565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611825575061182584846119b4565b611501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610894565b60006118ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119c09092919063ffffffff16565b805190915015610639578080602001905181019061190b919061285b565b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610894565b600082815260028401602052604081208290556116fc84846119cf565b600061150183836119db565b60606116fc84846000856119f3565b60006115018383611b0c565b60008181526001830160205260408120541515611501565b606082471015611a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610894565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611aae9190612849565b60006040518083038185875af1925050503d8060008114611aeb576040519150601f19603f3d011682016040523d82523d6000602084013e611af0565b606091505b5091509150611b0187838387611b5b565b979650505050505050565b6000818152600183016020526040812054611b53575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f4565b5060006105f4565b60608315611bf1578251600003611bea5773ffffffffffffffffffffffffffffffffffffffff85163b611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610894565b50816116fc565b6116fc8383815115611c065781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949190611d5c565b67ffffffffffffffff8116811461146f57600080fd5b60008083601f840112611c6257600080fd5b50813567ffffffffffffffff811115611c7a57600080fd5b602083019150836020828501011115611c9257600080fd5b9250929050565b600080600060408486031215611cae57600080fd5b8335611cb981611c3a565b9250602084013567ffffffffffffffff811115611cd557600080fd5b611ce186828701611c50565b9497909650939450505050565b60005b83811015611d09578181015183820152602001611cf1565b50506000910152565b60008151808452611d2a816020860160208601611cee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115016020830184611d12565b600060208284031215611d8157600080fd5b813561150181611c3a565b8315158152606060208201526000611da76060830185611d12565b8281036040840152611db98185611d12565b9695505050505050565b600060208284031215611dd557600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461146f57600080fd5b60008060408385031215611e1157600080fd5b8235611e1c81611ddc565b946020939093013593505050565b600080600060608486031215611e3f57600080fd5b8335611e4a81611ddc565b92506020840135611e5a81611ddc565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a06060860152611ea960c0860183611d12565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878503016080880152611ee58483611d12565b608089015188820390920160a089015281518082529186019450600092508501905b80831015611f46578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190611f07565b50979650505050505050565b60008060408385031215611f6557600080fd5b823591506020830135611f7781611ddc565b809150509250929050565b60008083601f840112611f9457600080fd5b50813567ffffffffffffffff811115611fac57600080fd5b6020830191508360208260051b8501011115611c9257600080fd5b60008060008060408587031215611fdd57600080fd5b843567ffffffffffffffff80821115611ff557600080fd5b61200188838901611f82565b9096509450602087013591508082111561201a57600080fd5b5061202787828801611f82565b95989497509550505050565b60006020828403121561204557600080fd5b813567ffffffffffffffff81111561205c57600080fd5b820160a0818503121561150157600080fd5b60008060008060006060868803121561208657600080fd5b853561209181611c3a565b9450602086013567ffffffffffffffff808211156120ae57600080fd5b6120ba89838a01611c50565b909650945060408801359150808211156120d357600080fd5b506120e088828901611c50565b969995985093965092949392505050565b60006020828403121561210357600080fd5b813561150181611ddc565b8183823760009101908152919050565b600181811c9082168061213257607f821691505b60208210810361216b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126121d457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261221357600080fd5b83018035915067ffffffffffffffff82111561222e57600080fd5b602001915036819003821315611c9257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261227857600080fd5b830160208101925035905067ffffffffffffffff81111561229857600080fd5b803603821315611c9257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561234557813561231381611ddc565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612300565b509495945050505050565b60208152813560208201526000602083013561236b81611c3a565b67ffffffffffffffff80821660408501526123896040860186612243565b925060a060608601526123a060c0860184836122a7565b9250506123b06060860186612243565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526123e68583856122a7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261241f57600080fd5b6020928801928301923591508382111561243857600080fd5b8160061b360383131561244a57600080fd5b8685030160a0870152611b018482846122f0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610639576000816000526020600020601f850160051c810160208610156124b65750805b601f850160051c820191505b818110156111ec578281556001016124c2565b67ffffffffffffffff8311156124ed576124ed61245e565b612501836124fb835461211e565b8361248d565b6000601f841160018114612553576000851561251d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e3a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156125a25786850135825560209485019460019092019101612582565b50868210156125dd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461264c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561265c81611ddc565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156126c2576126c261245e565b805483825580841015612714576126d8816125ef565b6126e1856125ef565b6000848152602081209283019291909101905b82821015612710578082558060018301556002820191506126f4565b5050505b5060008181526020812083915b858110156111ec576127338383612651565b6040929092019160029190910190600101612721565b8135815560018101602083013561275f81611c3a565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561279f60408601866121de565b935091506127b18383600287016124d5565b6127be60608601866121de565b935091506127d08383600387016124d5565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261280757600080fd5b91840191823591508082111561281c57600080fd5b506020820191508060061b360382131561283557600080fd5b6128438183600486016126a9565b50505050565b600082516121d4818460208701611cee565b60006020828403121561286d57600080fd5b8151801515811461150157600080fdfea164736f6c6343000818000a", + 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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162003067380380620030678339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e6980620001fe6000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a55780639fe74e2611610074578063cf6730f811610059578063cf6730f81461034a578063e4ca87541461036a578063f2fde38b1461038a57600080fd5b80639fe74e26146102ff578063b0f479a11461031f57600080fd5b806379ba50971461025e5780638462a2b91461027357806385572ffb146102935780638da5cb5b146102b357600080fd5b8063536c6bfa116100e1578063536c6bfa146101d15780635e35359e146101f15780636939cd97146102115780636d62d6331461023e57600080fd5b80630e958d6b1461011e57806335f170ef146101535780634e12498b146101815780635075a9d4146101a357600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e6101393660046121e6565b6103aa565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e36600461226b565b6103f5565b60405161014a9291906122f6565b34801561018d57600080fd5b506101a161019c366004612346565b610521565b005b3480156101af57600080fd5b506101c36101be366004612363565b6105ed565b60405190815260200161014a565b3480156101dd57600080fd5b506101a16101ec36600461237c565b610600565b3480156101fd57600080fd5b506101a161020c3660046123a8565b610664565b34801561021d57600080fd5b5061023161022c366004612363565b6106f9565b60405161014a91906123e9565b34801561024a57600080fd5b506101a16102593660046124d0565b610904565b34801561026a57600080fd5b506101a1610c1e565b34801561027f57600080fd5b506101a161028e36600461254c565b610d1b565b34801561029f57600080fd5b506101a16102ae3660046125b8565b61107c565b3480156102bf57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b34801561030b57600080fd5b506101a161031a3660046125f3565b611285565b34801561032b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102da565b34801561035657600080fd5b506101a16103653660046125b8565b611600565b34801561037657600080fd5b506101a1610385366004612363565b61173c565b34801561039657600080fd5b506101a16103a5366004612346565b6119a6565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103d99085908590612635565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061041090612645565b80601f016020809104026020016040519081016040528092919081815260200182805461043c90612645565b80156104895780601f1061045e57610100808354040283529160200191610489565b820191906000526020600020905b81548152906001019060200180831161046c57829003601f168201915b50505050509080600101805461049e90612645565b80601f01602080910402602001604051908101604052809291908181526020018280546104ca90612645565b80156105175780601f106104ec57610100808354040283529160200191610517565b820191906000526020600020905b8154815290600101906020018083116104fa57829003601f168201915b5050505050905082565b6105296119ba565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006105fa600583611a3d565b92915050565b6106086119ba565b6106128282611a50565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61066c6119ba565b61068d73ffffffffffffffffffffffffffffffffffffffff84168383611baa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ec91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161076890612645565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612645565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b505050505081526020016003820180546107fa90612645565b80601f016020809104026020016040519081016040528092919081815260200182805461082690612645565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108a1565b505050915250909392505050565b61090c6119ba565b6001610919600584611a3d565b14610958576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109688260025b60059190611c37565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916109b090612645565b80601f01602080910402602001604051908101604052809291908181526020018280546109dc90612645565b8015610a295780601f106109fe57610100808354040283529160200191610a29565b820191906000526020600020905b815481529060010190602001808311610a0c57829003601f168201915b50505050508152602001600382018054610a4290612645565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90612645565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ae9565b5050505081525050905060005b816080015151811015610bcd57610bc58383608001518381518110610b7257610b72612698565b60200260200101516020015184608001518481518110610b9457610b94612698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611baa9092919063ffffffff16565b600101610b4b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d236119ba565b60005b81811015610ec65760036000848484818110610d4457610d44612698565b9050602002810190610d5691906126c7565b610d6490602081019061226b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d9b57610d9b612698565b9050602002810190610dad91906126c7565b610dbb906020810190612705565b604051610dc9929190612635565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610e1057610e10612698565b9050602002810190610e2291906126c7565b610e30906020810190612705565b604051610e3e929190612635565b6040518091039020838383818110610e5857610e58612698565b9050602002810190610e6a91906126c7565b610e7890602081019061226b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610eb6911515815260200190565b60405180910390a3600101610d26565b5060005b8381101561107557600160036000878785818110610eea57610eea612698565b9050602002810190610efc91906126c7565b610f0a90602081019061226b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f4157610f41612698565b9050602002810190610f5391906126c7565b610f61906020810190612705565b604051610f6f929190612635565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610fbf57610fbf612698565b9050602002810190610fd191906126c7565b610fdf906020810190612705565b604051610fed929190612635565b604051809103902085858381811061100757611007612698565b905060200281019061101991906126c7565b61102790602081019061226b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611065911515815260200190565b60405180910390a3600101610eca565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146110cf576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094f565b6110df604082016020830161226b565b67ffffffffffffffff811660009081526003602052604090208054819061110590612645565b905060000361114c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611188908690600401612877565b600060405180830381600087803b1580156111a257600080fd5b505af19250505080156111b3575060015b611253573d8080156111e1576040519150601f19603f3d011682016040523d82523d6000602084013e6111e6565b606091505b506111f38435600161095f565b508335600090815260046020526040902084906112108282612c78565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611245908490612d78565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61128d6119ba565b60005b81811015611280578282828181106112aa576112aa612698565b90506020028101906112bc9190612d8b565b6112cd906040810190602001612dcd565b6113a057600360008484848181106112e7576112e7612698565b90506020028101906112f99190612d8b565b61130790602081019061226b565b67ffffffffffffffff1681526020810191909152604001600090812061132c91612182565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991683838381811061135f5761135f612698565b90506020028101906113719190612d8b565b61137f90602081019061226b565b60405167ffffffffffffffff909116815260200160405180910390a16115f8565b8282828181106113b2576113b2612698565b90506020028101906113c49190612d8b565b6113d2906040810190612705565b905060000361140d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061142557611425612698565b90506020028101906114379190612d8b565b61144590602081019061226b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061147b5761147b612698565b905060200281019061148d9190612d8b565b61149b906040810190612705565b82916114a8919083612a04565b508383838181106114bb576114bb612698565b90506020028101906114cd9190612d8b565b6114db906060810190612705565b159050611526578383838181106114f4576114f4612698565b90506020028101906115069190612d8b565b611514906060810190612705565b6001830191611524919083612a04565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284848481811061155957611559612698565b905060200281019061156b9190612d8b565b61157990602081019061226b565b85858581811061158b5761158b612698565b905060200281019061159d9190612d8b565b6115ab906040810190612705565b8787878181106115bd576115bd612698565b90506020028101906115cf9190612d8b565b6115dd906060810190612705565b6040516115ee959493929190612dea565b60405180910390a1505b600101611290565b333014611639576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611649604082016020830161226b565b6116566040830183612705565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116ad92509050612645565b159050806117035750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116ee9190612e2d565b9081526040519081900360200190205460ff16155b1561128057806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094f9190612d78565b6001611749600583611a3d565b14611783576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094f565b61178e81600061095f565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117d690612645565b80601f016020809104026020016040519081016040528092919081815260200182805461180290612645565b801561184f5780601f106118245761010080835404028352916020019161184f565b820191906000526020600020905b81548152906001019060200180831161183257829003601f168201915b5050505050815260200160038201805461186890612645565b80601f016020809104026020016040519081016040528092919081815260200182805461189490612645565b80156118e15780601f106118b6576101008083540402835291602001916118e1565b820191906000526020600020905b8154815290600101906020018083116118c457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156119645760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161190f565b5050505081525050905061197781611c4c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6119ae6119ba565b6119b781611c54565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094f565b565b6000611a498383611d49565b9392505050565b80471015611aba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5050905080611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094f565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611280908490611dd3565b6000611c44848484611edf565b949350505050565b6119b76119ba565b3373ffffffffffffffffffffffffffffffffffffffff821603611cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611d6d5750611d6d8484611efc565b611a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161094f565b6000611e35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f089092919063ffffffff16565b8051909150156112805780806020019051810190611e539190612e3f565b611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094f565b60008281526002840160205260408120829055611c448484611f17565b6000611a498383611f23565b6060611c448484600085611f3b565b6000611a498383612054565b60008181526001830160205260408120541515611a49565b606082471015611fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611ff69190612e2d565b60006040518083038185875af1925050503d8060008114612033576040519150601f19603f3d011682016040523d82523d6000602084013e612038565b606091505b5091509150612049878383876120a3565b979650505050505050565b600081815260018301602052604081205461209b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105fa565b5060006105fa565b606083156121395782516000036121325773ffffffffffffffffffffffffffffffffffffffff85163b612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094f565b5081611c44565b611c44838381511561214e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f9190612d78565b50805461218e90612645565b6000825580601f1061219e575050565b601f0160209004906000526020600020908101906119b791905b808211156121cc57600081556001016121b8565b5090565b67ffffffffffffffff811681146119b757600080fd5b6000806000604084860312156121fb57600080fd5b8335612206816121d0565b9250602084013567ffffffffffffffff8082111561222357600080fd5b818601915086601f83011261223757600080fd5b81358181111561224657600080fd5b87602082850101111561225857600080fd5b6020830194508093505050509250925092565b60006020828403121561227d57600080fd5b8135611a49816121d0565b60005b838110156122a357818101518382015260200161228b565b50506000910152565b600081518084526122c4816020860160208601612288565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061230960408301856122ac565b828103602084015261231b81856122ac565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119b757600080fd5b60006020828403121561235857600080fd5b8135611a4981612324565b60006020828403121561237557600080fd5b5035919050565b6000806040838503121561238f57600080fd5b823561239a81612324565b946020939093013593505050565b6000806000606084860312156123bd57600080fd5b83356123c881612324565b925060208401356123d881612324565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a0606086015261242760c08601836122ac565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261246384836122ac565b608089015188820390920160a089015281518082529186019450600092508501905b808310156124c4578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190612485565b50979650505050505050565b600080604083850312156124e357600080fd5b8235915060208301356124f581612324565b809150509250929050565b60008083601f84011261251257600080fd5b50813567ffffffffffffffff81111561252a57600080fd5b6020830191508360208260051b850101111561254557600080fd5b9250929050565b6000806000806040858703121561256257600080fd5b843567ffffffffffffffff8082111561257a57600080fd5b61258688838901612500565b9096509450602087013591508082111561259f57600080fd5b506125ac87828801612500565b95989497509550505050565b6000602082840312156125ca57600080fd5b813567ffffffffffffffff8111156125e157600080fd5b820160a08185031215611a4957600080fd5b6000806020838503121561260657600080fd5b823567ffffffffffffffff81111561261d57600080fd5b61262985828601612500565b90969095509350505050565b8183823760009101908152919050565b600181811c9082168061265957607f821691505b602082108103612692577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126126fb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261273a57600080fd5b83018035915067ffffffffffffffff82111561275557600080fd5b60200191503681900382131561254557600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261279f57600080fd5b830160208101925035905067ffffffffffffffff8111156127bf57600080fd5b80360382131561254557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561286c57813561283a81612324565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612827565b509495945050505050565b602081528135602082015260006020830135612892816121d0565b67ffffffffffffffff80821660408501526128b0604086018661276a565b925060a060608601526128c760c0860184836127ce565b9250506128d7606086018661276a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261290d8583856127ce565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261294657600080fd5b6020928801928301923591508382111561295f57600080fd5b8160061b360383131561297157600080fd5b8685030160a0870152612049848284612817565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611280576000816000526020600020601f850160051c810160208610156129dd5750805b601f850160051c820191505b818110156129fc578281556001016129e9565b505050505050565b67ffffffffffffffff831115612a1c57612a1c612985565b612a3083612a2a8354612645565b836129b4565b6000601f841160018114612a825760008515612a4c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611075565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612ad15786850135825560209485019460019092019101612ab1565b5086821015612b0c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612b7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b8135612b8b81612324565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115612bf157612bf1612985565b805483825580841015612c4357612c0781612b1e565b612c1085612b1e565b6000848152602081209283019291909101905b82821015612c3f57808255806001830155600282019150612c23565b5050505b5060008181526020812083915b858110156129fc57612c628383612b80565b6040929092019160029190910190600101612c50565b81358155600181016020830135612c8e816121d0565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612cce6040860186612705565b93509150612ce0838360028701612a04565b612ced6060860186612705565b93509150612cff838360038701612a04565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612d3657600080fd5b918401918235915080821115612d4b57600080fd5b506020820191508060061b3603821315612d6457600080fd5b612d72818360048601612bd8565b50505050565b602081526000611a4960208301846122ac565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126126fb57600080fd5b80151581146119b757600080fd5b600060208284031215612ddf57600080fd5b8135611a4981612dbf565b67ffffffffffffffff86168152606060208201526000612e0e6060830186886127ce565b8281036040840152612e218185876127ce565b98975050505050505050565b600082516126fb818460208701612288565b600060208284031215612e5157600080fd5b8151611a4981612dbf56fea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -310,9 +317,8 @@ func (_CCIPReceiver *CCIPReceiverCaller) SChainConfigs(opts *bind.CallOpts, dest return *outstruct, err } - 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) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) return *outstruct, err @@ -330,28 +336,6 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) SChainConfigs(destChainSelector return _CCIPReceiver.Contract.SChainConfigs(&_CCIPReceiver.CallOpts, destChainSelector) } -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) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPReceiver.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -376,40 +360,40 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) AcceptOwnership() (*types.Tr 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 *CCIPReceiverTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "applyChainUpdates", chains) } -func (_CCIPReceiver *CCIPReceiverSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) +func (_CCIPReceiver *CCIPReceiverSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPReceiver.Contract.ApplyChainUpdates(&_CCIPReceiver.TransactOpts, chains) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) +func (_CCIPReceiver *CCIPReceiverTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPReceiver.Contract.ApplyChainUpdates(&_CCIPReceiver.TransactOpts, chains) } -func (_CCIPReceiver *CCIPReceiverTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _CCIPReceiver.contract.Transact(opts, "disableChain", chainSelector) +func (_CCIPReceiver *CCIPReceiverTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "ccipReceive", message) } -func (_CCIPReceiver *CCIPReceiverSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { - return _CCIPReceiver.Contract.DisableChain(&_CCIPReceiver.TransactOpts, chainSelector) +func (_CCIPReceiver *CCIPReceiverSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { - return _CCIPReceiver.Contract.DisableChain(&_CCIPReceiver.TransactOpts, chainSelector) +func (_CCIPReceiver *CCIPReceiverTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) } -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 *CCIPReceiverTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "modifyRouter", newRouter) } -func (_CCIPReceiver *CCIPReceiverSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPReceiver.Contract.EnableChain(&_CCIPReceiver.TransactOpts, chainSelector, recipient, _extraArgsBytes) +func (_CCIPReceiver *CCIPReceiverSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.ModifyRouter(&_CCIPReceiver.TransactOpts, newRouter) } -func (_CCIPReceiver *CCIPReceiverTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPReceiver.Contract.EnableChain(&_CCIPReceiver.TransactOpts, chainSelector, recipient, _extraArgsBytes) +func (_CCIPReceiver *CCIPReceiverTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.ModifyRouter(&_CCIPReceiver.TransactOpts, newRouter) } func (_CCIPReceiver *CCIPReceiverTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { @@ -448,15 +432,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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) } @@ -496,8 +480,8 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) Receive() (*types.Transactio return _CCIPReceiver.Contract.Receive(&_CCIPReceiver.TransactOpts) } -type CCIPReceiverMessageAbandonedIterator struct { - Event *CCIPReceiverMessageAbandoned +type CCIPReceiverApprovedSenderModifiedIterator struct { + Event *CCIPReceiverApprovedSenderModified contract *bind.BoundContract event string @@ -508,7 +492,7 @@ type CCIPReceiverMessageAbandonedIterator struct { fail error } -func (it *CCIPReceiverMessageAbandonedIterator) Next() bool { +func (it *CCIPReceiverApprovedSenderModifiedIterator) Next() bool { if it.fail != nil { return false @@ -517,7 +501,7 @@ func (it *CCIPReceiverMessageAbandonedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageAbandoned) + it.Event = new(CCIPReceiverApprovedSenderModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -532,7 +516,7 @@ func (it *CCIPReceiverMessageAbandonedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageAbandoned) + it.Event = new(CCIPReceiverApprovedSenderModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -547,43 +531,52 @@ func (it *CCIPReceiverMessageAbandonedIterator) Next() bool { } } -func (it *CCIPReceiverMessageAbandonedIterator) Error() error { +func (it *CCIPReceiverApprovedSenderModifiedIterator) Error() error { return it.fail } -func (it *CCIPReceiverMessageAbandonedIterator) Close() error { +func (it *CCIPReceiverApprovedSenderModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverMessageAbandoned struct { - MessageId [32]byte - TokenReceiver common.Address - Raw types.Log +type CCIPReceiverApprovedSenderModified struct { + DestChainSelector uint64 + Recipient common.Hash + IsBeingApproved bool + Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageAbandonedIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderModifiedIterator, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPReceiverMessageAbandonedIterator{contract: _CCIPReceiver.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil + return &CCIPReceiverApprovedSenderModifiedIterator{contract: _CCIPReceiver.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -593,8 +586,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageAbandoned(opts *bind.Watc select { case log := <-logs: - event := new(CCIPReceiverMessageAbandoned) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { + event := new(CCIPReceiverApprovedSenderModified) + if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { return err } event.Raw = log @@ -615,17 +608,17 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageAbandoned(opts *bind.Watc }), nil } -func (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageAbandoned(log types.Log) (*CCIPReceiverMessageAbandoned, error) { - event := new(CCIPReceiverMessageAbandoned) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { +func (_CCIPReceiver *CCIPReceiverFilterer) ParseApprovedSenderModified(log types.Log) (*CCIPReceiverApprovedSenderModified, error) { + event := new(CCIPReceiverApprovedSenderModified) + if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverMessageFailedIterator struct { - Event *CCIPReceiverMessageFailed +type CCIPReceiverCCIPRouterModifiedIterator struct { + Event *CCIPReceiverCCIPRouterModified contract *bind.BoundContract event string @@ -636,7 +629,7 @@ type CCIPReceiverMessageFailedIterator struct { fail error } -func (it *CCIPReceiverMessageFailedIterator) Next() bool { +func (it *CCIPReceiverCCIPRouterModifiedIterator) Next() bool { if it.fail != nil { return false @@ -645,7 +638,7 @@ func (it *CCIPReceiverMessageFailedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageFailed) + it.Event = new(CCIPReceiverCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -660,7 +653,7 @@ func (it *CCIPReceiverMessageFailedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageFailed) + it.Event = new(CCIPReceiverCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -675,43 +668,51 @@ func (it *CCIPReceiverMessageFailedIterator) Next() bool { } } -func (it *CCIPReceiverMessageFailedIterator) Error() error { +func (it *CCIPReceiverCCIPRouterModifiedIterator) Error() error { return it.fail } -func (it *CCIPReceiverMessageFailedIterator) Close() error { +func (it *CCIPReceiverCCIPRouterModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverMessageFailed struct { - MessageId [32]byte - Reason []byte +type CCIPReceiverCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageFailedIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPReceiverCCIPRouterModifiedIterator, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) } - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } - return &CCIPReceiverMessageFailedIterator{contract: _CCIPReceiver.contract, event: "MessageFailed", logs: logs, sub: sub}, nil + return &CCIPReceiverCCIPRouterModifiedIterator{contract: _CCIPReceiver.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageFailed, messageId [][32]byte) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) } - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } @@ -721,8 +722,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageFailed(opts *bind.WatchOp select { case log := <-logs: - event := new(CCIPReceiverMessageFailed) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageFailed", log); err != nil { + event := new(CCIPReceiverCCIPRouterModified) + if err := _CCIPReceiver.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return err } event.Raw = log @@ -743,17 +744,17 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageFailed(opts *bind.WatchOp }), nil } -func (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageFailed(log types.Log) (*CCIPReceiverMessageFailed, error) { - event := new(CCIPReceiverMessageFailed) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageFailed", log); err != nil { +func (_CCIPReceiver *CCIPReceiverFilterer) ParseCCIPRouterModified(log types.Log) (*CCIPReceiverCCIPRouterModified, error) { + event := new(CCIPReceiverCCIPRouterModified) + if err := _CCIPReceiver.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverMessageRecoveredIterator struct { - Event *CCIPReceiverMessageRecovered +type CCIPReceiverChainAddedIterator struct { + Event *CCIPReceiverChainAdded contract *bind.BoundContract event string @@ -764,7 +765,7 @@ type CCIPReceiverMessageRecoveredIterator struct { fail error } -func (it *CCIPReceiverMessageRecoveredIterator) Next() bool { +func (it *CCIPReceiverChainAddedIterator) Next() bool { if it.fail != nil { return false @@ -773,7 +774,7 @@ func (it *CCIPReceiverMessageRecoveredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageRecovered) + it.Event = new(CCIPReceiverChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -788,7 +789,7 @@ func (it *CCIPReceiverMessageRecoveredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageRecovered) + it.Event = new(CCIPReceiverChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -803,42 +804,34 @@ func (it *CCIPReceiverMessageRecoveredIterator) Next() bool { } } -func (it *CCIPReceiverMessageRecoveredIterator) Error() error { +func (it *CCIPReceiverChainAddedIterator) Error() error { return it.fail } -func (it *CCIPReceiverMessageRecoveredIterator) Close() error { +func (it *CCIPReceiverChainAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverMessageRecovered struct { - MessageId [32]byte - Raw types.Log +type CCIPReceiverChainAdded struct { + RemoteChainSelector uint64 + Recipient []byte + ExtraArgsBytes []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) - } +func (_CCIPReceiver *CCIPReceiverFilterer) FilterChainAdded(opts *bind.FilterOpts) (*CCIPReceiverChainAddedIterator, error) { - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ChainAdded") if err != nil { return nil, err } - return &CCIPReceiverMessageRecoveredIterator{contract: _CCIPReceiver.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil + return &CCIPReceiverChainAddedIterator{contract: _CCIPReceiver.contract, event: "ChainAdded", 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) - } +func (_CCIPReceiver *CCIPReceiverFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainAdded) (event.Subscription, error) { - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ChainAdded") if err != nil { return nil, err } @@ -848,8 +841,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageRecovered(opts *bind.Watc select { case log := <-logs: - event := new(CCIPReceiverMessageRecovered) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + event := new(CCIPReceiverChainAdded) + if err := _CCIPReceiver.contract.UnpackLog(event, "ChainAdded", log); err != nil { return err } event.Raw = log @@ -870,17 +863,17 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageRecovered(opts *bind.Watc }), nil } -func (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageRecovered(log types.Log) (*CCIPReceiverMessageRecovered, error) { - event := new(CCIPReceiverMessageRecovered) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageRecovered", log); err != nil { +func (_CCIPReceiver *CCIPReceiverFilterer) ParseChainAdded(log types.Log) (*CCIPReceiverChainAdded, error) { + event := new(CCIPReceiverChainAdded) + if err := _CCIPReceiver.contract.UnpackLog(event, "ChainAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverMessageSucceededIterator struct { - Event *CCIPReceiverMessageSucceeded +type CCIPReceiverChainRemovedIterator struct { + Event *CCIPReceiverChainRemoved contract *bind.BoundContract event string @@ -891,7 +884,7 @@ type CCIPReceiverMessageSucceededIterator struct { fail error } -func (it *CCIPReceiverMessageSucceededIterator) Next() bool { +func (it *CCIPReceiverChainRemovedIterator) Next() bool { if it.fail != nil { return false @@ -900,7 +893,7 @@ func (it *CCIPReceiverMessageSucceededIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageSucceeded) + it.Event = new(CCIPReceiverChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -915,7 +908,7 @@ func (it *CCIPReceiverMessageSucceededIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverMessageSucceeded) + it.Event = new(CCIPReceiverChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -930,42 +923,32 @@ func (it *CCIPReceiverMessageSucceededIterator) Next() bool { } } -func (it *CCIPReceiverMessageSucceededIterator) Error() error { +func (it *CCIPReceiverChainRemovedIterator) Error() error { return it.fail } -func (it *CCIPReceiverMessageSucceededIterator) Close() error { +func (it *CCIPReceiverChainRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverMessageSucceeded struct { - MessageId [32]byte - Raw types.Log +type CCIPReceiverChainRemoved struct { + RemoveChainSelector uint64 + 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) - } +func (_CCIPReceiver *CCIPReceiverFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*CCIPReceiverChainRemovedIterator, error) { - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ChainRemoved") if err != nil { return nil, err } - return &CCIPReceiverMessageSucceededIterator{contract: _CCIPReceiver.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil + return &CCIPReceiverChainRemovedIterator{contract: _CCIPReceiver.contract, event: "ChainRemoved", 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) - } +func (_CCIPReceiver *CCIPReceiverFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainRemoved) (event.Subscription, error) { - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageSucceeded", messageIdRule) + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ChainRemoved") if err != nil { return nil, err } @@ -975,8 +958,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageSucceeded(opts *bind.Watc select { case log := <-logs: - event := new(CCIPReceiverMessageSucceeded) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + event := new(CCIPReceiverChainRemoved) + if err := _CCIPReceiver.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return err } event.Raw = log @@ -997,17 +980,17 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageSucceeded(opts *bind.Watc }), nil } -func (_CCIPReceiver *CCIPReceiverFilterer) ParseMessageSucceeded(log types.Log) (*CCIPReceiverMessageSucceeded, error) { - event := new(CCIPReceiverMessageSucceeded) - if err := _CCIPReceiver.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { +func (_CCIPReceiver *CCIPReceiverFilterer) ParseChainRemoved(log types.Log) (*CCIPReceiverChainRemoved, error) { + event := new(CCIPReceiverChainRemoved) + if err := _CCIPReceiver.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverOwnershipTransferRequestedIterator struct { - Event *CCIPReceiverOwnershipTransferRequested +type CCIPReceiverMessageAbandonedIterator struct { + Event *CCIPReceiverMessageAbandoned contract *bind.BoundContract event string @@ -1018,7 +1001,7 @@ type CCIPReceiverOwnershipTransferRequestedIterator struct { fail error } -func (it *CCIPReceiverOwnershipTransferRequestedIterator) Next() bool { +func (it *CCIPReceiverMessageAbandonedIterator) Next() bool { if it.fail != nil { return false @@ -1027,7 +1010,7 @@ func (it *CCIPReceiverOwnershipTransferRequestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverOwnershipTransferRequested) + it.Event = new(CCIPReceiverMessageAbandoned) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1042,7 +1025,7 @@ func (it *CCIPReceiverOwnershipTransferRequestedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverOwnershipTransferRequested) + it.Event = new(CCIPReceiverMessageAbandoned) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1057,51 +1040,43 @@ func (it *CCIPReceiverOwnershipTransferRequestedIterator) Next() bool { } } -func (it *CCIPReceiverOwnershipTransferRequestedIterator) Error() error { +func (it *CCIPReceiverMessageAbandonedIterator) Error() error { return it.fail } -func (it *CCIPReceiverOwnershipTransferRequestedIterator) Close() error { +func (it *CCIPReceiverMessageAbandonedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log +type CCIPReceiverMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverOwnershipTransferRequestedIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageAbandonedIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) if err != nil { return nil, err } - return &CCIPReceiverOwnershipTransferRequestedIterator{contract: _CCIPReceiver.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil + return &CCIPReceiverMessageAbandonedIterator{contract: _CCIPReceiver.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageAbandoned, messageId [][32]byte) (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) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) if err != nil { return nil, err } @@ -1111,8 +1086,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchOwnershipTransferRequested(opts select { case log := <-logs: - event := new(CCIPReceiverOwnershipTransferRequested) - if err := _CCIPReceiver.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + event := new(CCIPReceiverMessageAbandoned) + if err := _CCIPReceiver.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { return err } event.Raw = log @@ -1133,17 +1108,17 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchOwnershipTransferRequested(opts }), nil } -func (_CCIPReceiver *CCIPReceiverFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverOwnershipTransferRequested, error) { - event := new(CCIPReceiverOwnershipTransferRequested) - if err := _CCIPReceiver.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != 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 CCIPReceiverOwnershipTransferredIterator struct { - Event *CCIPReceiverOwnershipTransferred +type CCIPReceiverMessageFailedIterator struct { + Event *CCIPReceiverMessageFailed contract *bind.BoundContract event string @@ -1154,7 +1129,7 @@ type CCIPReceiverOwnershipTransferredIterator struct { fail error } -func (it *CCIPReceiverOwnershipTransferredIterator) Next() bool { +func (it *CCIPReceiverMessageFailedIterator) Next() bool { if it.fail != nil { return false @@ -1163,7 +1138,7 @@ func (it *CCIPReceiverOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverOwnershipTransferred) + it.Event = new(CCIPReceiverMessageFailed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1178,7 +1153,7 @@ func (it *CCIPReceiverOwnershipTransferredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverOwnershipTransferred) + it.Event = new(CCIPReceiverMessageFailed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1193,44 +1168,562 @@ func (it *CCIPReceiverOwnershipTransferredIterator) Next() bool { } } -func (it *CCIPReceiverOwnershipTransferredIterator) Error() error { +func (it *CCIPReceiverMessageFailedIterator) Error() error { return it.fail } -func (it *CCIPReceiverOwnershipTransferredIterator) Close() error { +func (it *CCIPReceiverMessageFailedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverOwnershipTransferred struct { - From common.Address - To common.Address - Raw types.Log +type CCIPReceiverMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverOwnershipTransferredIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageFailedIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "MessageFailed", messageIdRule) if err != nil { return nil, err } - return &CCIPReceiverOwnershipTransferredIterator{contract: _CCIPReceiver.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &CCIPReceiverMessageFailedIterator{contract: _CCIPReceiver.contract, event: "MessageFailed", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageFailed, messageId [][32]byte) (event.Subscription, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + 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 { @@ -1278,14 +1771,158 @@ func (_CCIPReceiver *CCIPReceiverFilterer) ParseOwnershipTransferred(log types.L return event, nil } +type CCIPReceiverTokensWithdrawnByOwnerIterator struct { + Event *CCIPReceiverTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverTokensWithdrawnByOwner) + 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(CCIPReceiverTokensWithdrawnByOwner) + 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 *CCIPReceiverTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPReceiverTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &CCIPReceiverTokensWithdrawnByOwnerIterator{contract: _CCIPReceiver.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPReceiverTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(CCIPReceiverTokensWithdrawnByOwner) + if err := _CCIPReceiver.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*CCIPReceiverTokensWithdrawnByOwner, error) { + event := new(CCIPReceiverTokensWithdrawnByOwner) + if err := _CCIPReceiver.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type SChainConfigs struct { - Disabled bool Recipient []byte ExtraArgsBytes []byte } func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _CCIPReceiver.abi.Events["ApprovedSenderModified"].ID: + return _CCIPReceiver.ParseApprovedSenderModified(log) + case _CCIPReceiver.abi.Events["CCIPRouterModified"].ID: + return _CCIPReceiver.ParseCCIPRouterModified(log) + case _CCIPReceiver.abi.Events["ChainAdded"].ID: + return _CCIPReceiver.ParseChainAdded(log) + case _CCIPReceiver.abi.Events["ChainRemoved"].ID: + return _CCIPReceiver.ParseChainRemoved(log) case _CCIPReceiver.abi.Events["MessageAbandoned"].ID: return _CCIPReceiver.ParseMessageAbandoned(log) case _CCIPReceiver.abi.Events["MessageFailed"].ID: @@ -1298,12 +1935,30 @@ func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, return _CCIPReceiver.ParseOwnershipTransferRequested(log) case _CCIPReceiver.abi.Events["OwnershipTransferred"].ID: return _CCIPReceiver.ParseOwnershipTransferred(log) + case _CCIPReceiver.abi.Events["TokensWithdrawnByOwner"].ID: + return _CCIPReceiver.ParseTokensWithdrawnByOwner(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) } } +func (CCIPReceiverApprovedSenderModified) Topic() common.Hash { + return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +} + +func (CCIPReceiverCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (CCIPReceiverChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (CCIPReceiverChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + func (CCIPReceiverMessageAbandoned) Topic() common.Hash { return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") } @@ -1328,6 +1983,10 @@ func (CCIPReceiverOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (CCIPReceiverTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + func (_CCIPReceiver *CCIPReceiver) Address() common.Address { return _CCIPReceiver.address } @@ -1347,17 +2006,15 @@ type CCIPReceiverInterface interface { error) - TypeAndVersion(opts *bind.CallOpts) (string, error) - AbandonFailedMessage(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) + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) - DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) @@ -1365,7 +2022,7 @@ type CCIPReceiverInterface 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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -1373,6 +2030,30 @@ type CCIPReceiverInterface interface { Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderModifiedIterator, error) + + WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderModified(log types.Log) (*CCIPReceiverApprovedSenderModified, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPReceiverCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*CCIPReceiverCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts) (*CCIPReceiverChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*CCIPReceiverChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*CCIPReceiverChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*CCIPReceiverChainRemoved, error) + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverMessageAbandonedIterator, error) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverMessageAbandoned, messageId [][32]byte) (event.Subscription, error) @@ -1409,6 +2090,12 @@ type CCIPReceiverInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPReceiverOwnershipTransferred, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPReceiverTokensWithdrawnByOwnerIterator, error) + + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPReceiverTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokensWithdrawnByOwner(log types.Log) (*CCIPReceiverTokensWithdrawnByOwner, 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 index c309ab05e4..f6ca5ca628 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -30,19 +30,26 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseApprovedSenderUpdate struct { +type CCIPBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + type ClientEVMTokenAmount struct { Token common.Address Amount *big.Int } var CCIPSenderMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InsufficientNativeFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200219c3803806200219c8339810160408190526200003491620001a8565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000fd565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b031660805250620001da565b336001600160a01b03821603620001575760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611f8a620002126000396000818161028401528181610b8d01528181610c5601528181610d2a0152610d660152611f8a6000f3fe6080604052600436106100d65760003560e01c806379ba50971161007f578063b0f479a111610059578063b0f479a114610275578063d8469e40146102a8578063effde240146102c8578063f2fde38b146102e957600080fd5b806379ba5097146101f45780638462a2b9146102095780638da5cb5b1461022957600080fd5b806341eade46116100b057806341eade4614610192578063536c6bfa146101b45780635e35359e146101d457600080fd5b80630e958d6b146100e2578063181f5a771461011757806335f170ef1461016357600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101026100fd3660046116e6565b610309565b60405190151581526020015b60405180910390f35b34801561012357600080fd5b50604080518082018252601481527f4343495053656e64657220312e302e302d6465760000000000000000000000006020820152905161010e91906117a7565b34801561016f57600080fd5b5061018361017e3660046117c1565b610354565b60405161010e939291906117dc565b34801561019e57600080fd5b506101b26101ad3660046117c1565b61048b565b005b3480156101c057600080fd5b506101b26101cf366004611835565b6104d6565b3480156101e057600080fd5b506101b26101ef36600461186c565b6104ec565b34801561020057600080fd5b506101b261051a565b34801561021557600080fd5b506101b26102243660046118f2565b61061c565b34801561023557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010e565b34801561028157600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610250565b3480156102b457600080fd5b506101b26102c336600461195e565b6107fd565b6102db6102d63660046119df565b61087e565b60405190815260200161010e565b3480156102f557600080fd5b506101b2610304366004611aa0565b610e49565b67ffffffffffffffff831660009081526002602052604080822090516003909101906103389085908590611abd565b9081526040519081900360200190205460ff1690509392505050565b6002602052600090815260409020805460018201805460ff909216929161037a90611acd565b80601f01602080910402602001604051908101604052809291908181526020018280546103a690611acd565b80156103f35780601f106103c8576101008083540402835291602001916103f3565b820191906000526020600020905b8154815290600101906020018083116103d657829003601f168201915b50505050509080600201805461040890611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461043490611acd565b80156104815780601f1061045657610100808354040283529160200191610481565b820191906000526020600020905b81548152906001019060200180831161046457829003601f168201915b5050505050905083565b610493610e5d565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6104de610e5d565b6104e88282610ee0565b5050565b6104f4610e5d565b61051573ffffffffffffffffffffffffffffffffffffffff8416838361103a565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610624610e5d565b60005b81811015610707576002600084848481811061064557610645611b20565b90506020028101906106579190611b4f565b6106659060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030183838381811061069c5761069c611b20565b90506020028101906106ae9190611b4f565b6106bc906020810190611b8d565b6040516106ca929190611abd565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610627565b5060005b838110156107f65760016002600087878581811061072b5761072b611b20565b905060200281019061073d9190611b4f565b61074b9060208101906117c1565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060030186868481811061078257610782611b20565b90506020028101906107949190611b4f565b6107a2906020810190611b8d565b6040516107b0929190611abd565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560010161070b565b5050505050565b610805610e5d565b67ffffffffffffffff851660009081526002602052604090206001810161082d858783611c69565b5081156108455760028101610843838583611c69565b505b805460ff16156108765780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681555b505050505050565b67ffffffffffffffff86166000908152600260205260408120600181018054899291906108aa90611acd565b159050806108b95750805460ff165b156108fc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610597565b6040805160a08101825267ffffffffffffffff8b1660009081526002602052918220600101805482919061092f90611acd565b80601f016020809104026020016040519081016040528092919081815260200182805461095b90611acd565b80156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610a3857610a2960408302860136819003810190611d83565b81526020019060010190610a0c565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600260008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018054610a9390611acd565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90611acd565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b5050505050815250905060005b88811015610c1557610b8833308c8c85818110610b3857610b38611b20565b905060400201602001358d8d86818110610b5457610b54611b20565b610b6a9260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff1692919061110e565b610c0d7f00000000000000000000000000000000000000000000000000000000000000008b8b84818110610bbe57610bbe611b20565b905060400201602001358c8c85818110610bda57610bda611b20565b610bf09260206040909202019081019150611aa0565b73ffffffffffffffffffffffffffffffffffffffff169190611172565b600101610b19565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610c8d908e908690600401611ddb565b602060405180830381865afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce9190611ef0565b905073ffffffffffffffffffffffffffffffffffffffff861615610d4f57610d0e73ffffffffffffffffffffffffffffffffffffffff871633308461110e565b610d4f73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000083611172565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906396f4e9f990881615610d9c576000610d9e565b825b8d856040518463ffffffff1660e01b8152600401610dbd929190611ddb565b60206040518083038185885af1158015610ddb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e009190611ef0565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051610e3391815260200190565b60405180910390a1505050509695505050505050565b610e51610e5d565b610e5a81611270565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610597565b565b80471015610f4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610fa4576040519150601f19603f3d011682016040523d82523d6000602084013e610fa9565b606091505b5050905080610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526105159084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611365565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261116c9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161108c565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190611ef0565b6112179190611f09565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061116c9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161108c565b3373ffffffffffffffffffffffffffffffffffffffff8216036112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610597565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006113c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114719092919063ffffffff16565b80519091501561051557808060200190518101906113e59190611f49565b610515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610597565b60606114808484600085611488565b949350505050565b60608247101561151a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610597565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115439190611f6b565b60006040518083038185875af1925050503d8060008114611580576040519150601f19603f3d011682016040523d82523d6000602084013e611585565b606091505b5091509150611596878383876115a1565b979650505050505050565b606083156116375782516000036116305773ffffffffffffffffffffffffffffffffffffffff85163b611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b5081611480565b611480838381511561164c5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059791906117a7565b803567ffffffffffffffff8116811461169857600080fd5b919050565b60008083601f8401126116af57600080fd5b50813567ffffffffffffffff8111156116c757600080fd5b6020830191508360208285010111156116df57600080fd5b9250929050565b6000806000604084860312156116fb57600080fd5b61170484611680565b9250602084013567ffffffffffffffff81111561172057600080fd5b61172c8682870161169d565b9497909650939450505050565b60005b8381101561175457818101518382015260200161173c565b50506000910152565b60008151808452611775816020860160208601611739565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ba602083018461175d565b9392505050565b6000602082840312156117d357600080fd5b6117ba82611680565b83151581526060602082015260006117f7606083018561175d565b8281036040840152611809818561175d565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e5a57600080fd5b6000806040838503121561184857600080fd5b823561185381611813565b946020939093013593505050565b803561169881611813565b60008060006060848603121561188157600080fd5b833561188c81611813565b9250602084013561189c81611813565b929592945050506040919091013590565b60008083601f8401126118bf57600080fd5b50813567ffffffffffffffff8111156118d757600080fd5b6020830191508360208260051b85010111156116df57600080fd5b6000806000806040858703121561190857600080fd5b843567ffffffffffffffff8082111561192057600080fd5b61192c888389016118ad565b9096509450602087013591508082111561194557600080fd5b50611952878288016118ad565b95989497509550505050565b60008060008060006060868803121561197657600080fd5b61197f86611680565b9450602086013567ffffffffffffffff8082111561199c57600080fd5b6119a889838a0161169d565b909650945060408801359150808211156119c157600080fd5b506119ce8882890161169d565b969995985093965092949392505050565b600080600080600080608087890312156119f857600080fd5b611a0187611680565b9550602087013567ffffffffffffffff80821115611a1e57600080fd5b818901915089601f830112611a3257600080fd5b813581811115611a4157600080fd5b8a60208260061b8501011115611a5657600080fd5b602083019750809650506040890135915080821115611a7457600080fd5b50611a8189828a0161169d565b9094509250611a94905060608801611861565b90509295509295509295565b600060208284031215611ab257600080fd5b81356117ba81611813565b8183823760009101908152919050565b600181811c90821680611ae157607f821691505b602082108103611b1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611b8357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bc257600080fd5b83018035915067ffffffffffffffff821115611bdd57600080fd5b6020019150368190038213156116df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610515576000816000526020600020601f850160051c81016020861015611c4a5750805b601f850160051c820191505b8181101561087657828155600101611c56565b67ffffffffffffffff831115611c8157611c81611bf2565b611c9583611c8f8354611acd565b83611c21565b6000601f841160018114611ce75760008515611cb15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556107f6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611d365786850135825560209485019460019092019101611d16565b5086821015611d71577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060408284031215611d9557600080fd5b6040516040810181811067ffffffffffffffff82111715611db857611db8611bf2565b6040528235611dc681611813565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a06040860152611e0a60e086018261175d565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878403016060880152611e45838361175d565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611ea6578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190611e67565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a01529550611ee2818761175d565b9a9950505050505050505050565b600060208284031215611f0257600080fd5b5051919050565b80820180821115611f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600060208284031215611f5b57600080fd5b815180151581146117ba57600080fd5b60008251611b8381846020870161173956fea164736f6c6343000818000a", + 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\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162002759380380620027598339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61255b80620001fe6000396000f3fe6080604052600436106100cb5760003560e01c80638462a2b911610074578063b0f479a11161004e578063b0f479a11461023d578063effde24014610268578063f2fde38b1461028957600080fd5b80638462a2b9146101b15780638da5cb5b146101d15780639fe74e261461021d57600080fd5b8063536c6bfa116100a5578063536c6bfa1461015c5780635e35359e1461017c57806379ba50971461019c57600080fd5b80630e958d6b146100d757806335f170ef1461010c5780634e12498b1461013a57600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b506100f76100f2366004611c11565b6102a9565b60405190151581526020015b60405180910390f35b34801561011857600080fd5b5061012c610127366004611c64565b6102f4565b604051610103929190611cf4565b34801561014657600080fd5b5061015a610155366004611d4f565b610420565b005b34801561016857600080fd5b5061015a610177366004611d6c565b6104ec565b34801561018857600080fd5b5061015a610197366004611d98565b610550565b3480156101a857600080fd5b5061015a6105e5565b3480156101bd57600080fd5b5061015a6101cc366004611e1e565b6106e7565b3480156101dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610103565b34801561022957600080fd5b5061015a610238366004611e8a565b610a48565b34801561024957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101f8565b61027b610276366004611ecc565b610dc8565b604051908152602001610103565b34801561029557600080fd5b5061015a6102a4366004611d4f565b611326565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102d89085908590611f8d565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061030f90611f9d565b80601f016020809104026020016040519081016040528092919081815260200182805461033b90611f9d565b80156103885780601f1061035d57610100808354040283529160200191610388565b820191906000526020600020905b81548152906001019060200180831161036b57829003601f168201915b50505050509080600101805461039d90611f9d565b80601f01602080910402602001604051908101604052809291908181526020018280546103c990611f9d565b80156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905082565b61042861133a565b73ffffffffffffffffffffffffffffffffffffffff8116610475576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6104f461133a565b6104fe82826113bd565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61055861133a565b61057973ffffffffffffffffffffffffffffffffffffffff84168383611517565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105d891815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6106ef61133a565b60005b81811015610892576003600084848481811061071057610710611ff0565b9050602002810190610722919061201f565b610730906020810190611c64565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061076757610767611ff0565b9050602002810190610779919061201f565b61078790602081019061205d565b604051610795929190611f8d565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106107dc576107dc611ff0565b90506020028101906107ee919061201f565b6107fc90602081019061205d565b60405161080a929190611f8d565b604051809103902083838381811061082457610824611ff0565b9050602002810190610836919061201f565b610844906020810190611c64565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610882911515815260200190565b60405180910390a36001016106f2565b5060005b83811015610a41576001600360008787858181106108b6576108b6611ff0565b90506020028101906108c8919061201f565b6108d6906020810190611c64565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061090d5761090d611ff0565b905060200281019061091f919061201f565b61092d90602081019061205d565b60405161093b929190611f8d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061098b5761098b611ff0565b905060200281019061099d919061201f565b6109ab90602081019061205d565b6040516109b9929190611f8d565b60405180910390208585838181106109d3576109d3611ff0565b90506020028101906109e5919061201f565b6109f3906020810190611c64565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051610a31911515815260200190565b60405180910390a3600101610896565b5050505050565b610a5061133a565b60005b81811015610dc357828282818110610a6d57610a6d611ff0565b9050602002810190610a7f91906120c2565b610a90906040810190602001612104565b610b635760036000848484818110610aaa57610aaa611ff0565b9050602002810190610abc91906120c2565b610aca906020810190611c64565b67ffffffffffffffff16815260208101919091526040016000908120610aef91611b5d565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916838383818110610b2257610b22611ff0565b9050602002810190610b3491906120c2565b610b42906020810190611c64565b60405167ffffffffffffffff909116815260200160405180910390a1610dbb565b828282818110610b7557610b75611ff0565b9050602002810190610b8791906120c2565b610b9590604081019061205d565b9050600003610bd0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110610be857610be8611ff0565b9050602002810190610bfa91906120c2565b610c08906020810190611c64565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110610c3e57610c3e611ff0565b9050602002810190610c5091906120c2565b610c5e90604081019061205d565b8291610c6b9190836121a0565b50838383818110610c7e57610c7e611ff0565b9050602002810190610c9091906120c2565b610c9e90606081019061205d565b159050610ce957838383818110610cb757610cb7611ff0565b9050602002810190610cc991906120c2565b610cd790606081019061205d565b6001830191610ce79190836121a0565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212848484818110610d1c57610d1c611ff0565b9050602002810190610d2e91906120c2565b610d3c906020810190611c64565b858585818110610d4e57610d4e611ff0565b9050602002810190610d6091906120c2565b610d6e90604081019061205d565b878787818110610d8057610d80611ff0565b9050602002810190610d9291906120c2565b610da090606081019061205d565b604051610db1959493929190612303565b60405180910390a1505b600101610a53565b505050565b67ffffffffffffffff8616600090815260036020526040812080548891908190610df190611f9d565b9050600003610e38576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610662565b6040805160a08101825267ffffffffffffffff8b16600090815260036020529182208054829190610e6890611f9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490611f9d565b8015610ee15780601f10610eb657610100808354040283529160200191610ee1565b820191906000526020600020905b815481529060010190602001808311610ec457829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610f7157610f6260408302860136819003810190612346565b81526020019060010190610f45565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610fcc90611f9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff890611f9d565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b5050505050815250905060005b88811015611147576110c133308c8c8581811061107157611071611ff0565b905060400201602001358d8d8681811061108d5761108d611ff0565b6110a39260206040909202019081019150611d4f565b73ffffffffffffffffffffffffffffffffffffffff169291906115eb565b60025461113f9073ffffffffffffffffffffffffffffffffffffffff168b8b848181106110f0576110f0611ff0565b905060400201602001358c8c8581811061110c5761110c611ff0565b6111229260206040909202019081019150611d4f565b73ffffffffffffffffffffffffffffffffffffffff16919061164f565b600101611052565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906111a1908e90869060040161239e565b602060405180830381865afa1580156111be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e291906124b3565b905073ffffffffffffffffffffffffffffffffffffffff8616156112495761122273ffffffffffffffffffffffffffffffffffffffff87163330846115eb565b6002546112499073ffffffffffffffffffffffffffffffffffffffff88811691168361164f565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f99088161561127957600061127b565b825b8d856040518463ffffffff1660e01b815260040161129a92919061239e565b60206040518083038185885af11580156112b8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112dd91906124b3565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161131091815260200190565b60405180910390a1505050509695505050505050565b61132e61133a565b6113378161174d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610662565b565b80471015611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610662565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611481576040519150601f19603f3d011682016040523d82523d6000602084013e611486565b606091505b5050905080610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610662565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610dc39084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611842565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526116499085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611569565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156116c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ea91906124b3565b6116f491906124cc565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506116499085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611569565b3373ffffffffffffffffffffffffffffffffffffffff8216036117cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610662565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006118a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661194e9092919063ffffffff16565b805190915015610dc357808060200190518101906118c2919061250c565b610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610662565b606061195d8484600085611965565b949350505050565b6060824710156119f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610662565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a209190612529565b60006040518083038185875af1925050503d8060008114611a5d576040519150601f19603f3d011682016040523d82523d6000602084013e611a62565b606091505b5091509150611a7387838387611a7e565b979650505050505050565b60608315611b14578251600003611b0d5773ffffffffffffffffffffffffffffffffffffffff85163b611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610662565b508161195d565b61195d8383815115611b295781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610662919061253b565b508054611b6990611f9d565b6000825580601f10611b79575050565b601f01602090049060005260206000209081019061133791905b80821115611ba75760008155600101611b93565b5090565b803567ffffffffffffffff81168114611bc357600080fd5b919050565b60008083601f840112611bda57600080fd5b50813567ffffffffffffffff811115611bf257600080fd5b602083019150836020828501011115611c0a57600080fd5b9250929050565b600080600060408486031215611c2657600080fd5b611c2f84611bab565b9250602084013567ffffffffffffffff811115611c4b57600080fd5b611c5786828701611bc8565b9497909650939450505050565b600060208284031215611c7657600080fd5b611c7f82611bab565b9392505050565b60005b83811015611ca1578181015183820152602001611c89565b50506000910152565b60008151808452611cc2816020860160208601611c86565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611d076040830185611caa565b8281036020840152611d198185611caa565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461133757600080fd5b8035611bc381611d22565b600060208284031215611d6157600080fd5b8135611c7f81611d22565b60008060408385031215611d7f57600080fd5b8235611d8a81611d22565b946020939093013593505050565b600080600060608486031215611dad57600080fd5b8335611db881611d22565b92506020840135611dc881611d22565b929592945050506040919091013590565b60008083601f840112611deb57600080fd5b50813567ffffffffffffffff811115611e0357600080fd5b6020830191508360208260051b8501011115611c0a57600080fd5b60008060008060408587031215611e3457600080fd5b843567ffffffffffffffff80821115611e4c57600080fd5b611e5888838901611dd9565b90965094506020870135915080821115611e7157600080fd5b50611e7e87828801611dd9565b95989497509550505050565b60008060208385031215611e9d57600080fd5b823567ffffffffffffffff811115611eb457600080fd5b611ec085828601611dd9565b90969095509350505050565b60008060008060008060808789031215611ee557600080fd5b611eee87611bab565b9550602087013567ffffffffffffffff80821115611f0b57600080fd5b818901915089601f830112611f1f57600080fd5b813581811115611f2e57600080fd5b8a60208260061b8501011115611f4357600080fd5b602083019750809650506040890135915080821115611f6157600080fd5b50611f6e89828a01611bc8565b9094509250611f81905060608801611d44565b90509295509295509295565b8183823760009101908152919050565b600181811c90821680611fb157607f821691505b602082108103611fea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261205357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261209257600080fd5b83018035915067ffffffffffffffff8211156120ad57600080fd5b602001915036819003821315611c0a57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261205357600080fd5b801515811461133757600080fd5b60006020828403121561211657600080fd5b8135611c7f816120f6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610dc3576000816000526020600020601f850160051c810160208610156121795750805b601f850160051c820191505b8181101561219857828155600101612185565b505050505050565b67ffffffffffffffff8311156121b8576121b8612121565b6121cc836121c68354611f9d565b83612150565b6000601f84116001811461221e57600085156121e85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610a41565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561226d578685013582556020948501946001909201910161224d565b50868210156122a8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff861681526060602082015260006123276060830186886122ba565b828103604084015261233a8185876122ba565b98975050505050505050565b60006040828403121561235857600080fd5b6040516040810181811067ffffffffffffffff8211171561237b5761237b612121565b604052823561238981611d22565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526123cd60e0860182611caa565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526124088383611caa565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612469578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600193909301929086019061242a565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506124a58187611caa565b9a9950505050505050505050565b6000602082840312156124c557600080fd5b5051919050565b80820180821115612506577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561251e57600080fd5b8151611c7f816120f6565b60008251612053818460208701611c86565b602081526000611c7f6020830184611caa56fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -258,9 +265,8 @@ func (_CCIPSender *CCIPSenderCaller) SChainConfigs(opts *bind.CallOpts, destChai return *outstruct, err } - 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) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) return *outstruct, err @@ -278,28 +284,6 @@ func (_CCIPSender *CCIPSenderCallerSession) SChainConfigs(destChainSelector uint return _CCIPSender.Contract.SChainConfigs(&_CCIPSender.CallOpts, destChainSelector) } -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") } @@ -312,40 +296,40 @@ func (_CCIPSender *CCIPSenderTransactorSession) AcceptOwnership() (*types.Transa 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 *CCIPSenderTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "applyChainUpdates", chains) } -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 *CCIPSenderSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPSender.Contract.ApplyChainUpdates(&_CCIPSender.TransactOpts, chains) } -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 *CCIPSenderTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPSender.Contract.ApplyChainUpdates(&_CCIPSender.TransactOpts, chains) } -func (_CCIPSender *CCIPSenderTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _CCIPSender.contract.Transact(opts, "disableChain", chainSelector) +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) DisableChain(chainSelector uint64) (*types.Transaction, error) { - return _CCIPSender.Contract.DisableChain(&_CCIPSender.TransactOpts, chainSelector) +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) DisableChain(chainSelector uint64) (*types.Transaction, error) { - return _CCIPSender.Contract.DisableChain(&_CCIPSender.TransactOpts, chainSelector) +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) EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPSender.contract.Transact(opts, "enableChain", chainSelector, recipient, _extraArgsBytes) +func (_CCIPSender *CCIPSenderTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "modifyRouter", newRouter) } -func (_CCIPSender *CCIPSenderSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPSender.Contract.EnableChain(&_CCIPSender.TransactOpts, chainSelector, recipient, _extraArgsBytes) +func (_CCIPSender *CCIPSenderSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.ModifyRouter(&_CCIPSender.TransactOpts, newRouter) } -func (_CCIPSender *CCIPSenderTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPSender.Contract.EnableChain(&_CCIPSender.TransactOpts, chainSelector, recipient, _extraArgsBytes) +func (_CCIPSender *CCIPSenderTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.ModifyRouter(&_CCIPSender.TransactOpts, newRouter) } func (_CCIPSender *CCIPSenderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -360,15 +344,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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) } @@ -408,8 +392,8 @@ func (_CCIPSender *CCIPSenderTransactorSession) Receive() (*types.Transaction, e return _CCIPSender.Contract.Receive(&_CCIPSender.TransactOpts) } -type CCIPSenderMessageReceivedIterator struct { - Event *CCIPSenderMessageReceived +type CCIPSenderApprovedSenderModifiedIterator struct { + Event *CCIPSenderApprovedSenderModified contract *bind.BoundContract event string @@ -420,7 +404,7 @@ type CCIPSenderMessageReceivedIterator struct { fail error } -func (it *CCIPSenderMessageReceivedIterator) Next() bool { +func (it *CCIPSenderApprovedSenderModifiedIterator) Next() bool { if it.fail != nil { return false @@ -429,7 +413,7 @@ func (it *CCIPSenderMessageReceivedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPSenderMessageReceived) + it.Event = new(CCIPSenderApprovedSenderModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -444,7 +428,7 @@ func (it *CCIPSenderMessageReceivedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPSenderMessageReceived) + it.Event = new(CCIPSenderApprovedSenderModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -459,32 +443,52 @@ func (it *CCIPSenderMessageReceivedIterator) Next() bool { } } -func (it *CCIPSenderMessageReceivedIterator) Error() error { +func (it *CCIPSenderApprovedSenderModifiedIterator) Error() error { return it.fail } -func (it *CCIPSenderMessageReceivedIterator) Close() error { +func (it *CCIPSenderApprovedSenderModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPSenderMessageReceived struct { - MessageId [32]byte - Raw types.Log +type CCIPSenderApprovedSenderModified struct { + DestChainSelector uint64 + Recipient common.Hash + IsBeingApproved bool + Raw types.Log } -func (_CCIPSender *CCIPSenderFilterer) FilterMessageReceived(opts *bind.FilterOpts) (*CCIPSenderMessageReceivedIterator, error) { +func (_CCIPSender *CCIPSenderFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderModifiedIterator, error) { - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "MessageReceived") + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPSenderMessageReceivedIterator{contract: _CCIPSender.contract, event: "MessageReceived", logs: logs, sub: sub}, nil + return &CCIPSenderApprovedSenderModifiedIterator{contract: _CCIPSender.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil } -func (_CCIPSender *CCIPSenderFilterer) WatchMessageReceived(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageReceived) (event.Subscription, error) { +func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "MessageReceived") + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -494,8 +498,8 @@ func (_CCIPSender *CCIPSenderFilterer) WatchMessageReceived(opts *bind.WatchOpts select { case log := <-logs: - event := new(CCIPSenderMessageReceived) - if err := _CCIPSender.contract.UnpackLog(event, "MessageReceived", log); err != nil { + event := new(CCIPSenderApprovedSenderModified) + if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { return err } event.Raw = log @@ -516,17 +520,17 @@ func (_CCIPSender *CCIPSenderFilterer) WatchMessageReceived(opts *bind.WatchOpts }), nil } -func (_CCIPSender *CCIPSenderFilterer) ParseMessageReceived(log types.Log) (*CCIPSenderMessageReceived, error) { - event := new(CCIPSenderMessageReceived) - if err := _CCIPSender.contract.UnpackLog(event, "MessageReceived", log); err != nil { +func (_CCIPSender *CCIPSenderFilterer) ParseApprovedSenderModified(log types.Log) (*CCIPSenderApprovedSenderModified, error) { + event := new(CCIPSenderApprovedSenderModified) + if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPSenderMessageSentIterator struct { - Event *CCIPSenderMessageSent +type CCIPSenderCCIPRouterModifiedIterator struct { + Event *CCIPSenderCCIPRouterModified contract *bind.BoundContract event string @@ -537,7 +541,7 @@ type CCIPSenderMessageSentIterator struct { fail error } -func (it *CCIPSenderMessageSentIterator) Next() bool { +func (it *CCIPSenderCCIPRouterModifiedIterator) Next() bool { if it.fail != nil { return false @@ -546,7 +550,7 @@ func (it *CCIPSenderMessageSentIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPSenderMessageSent) + it.Event = new(CCIPSenderCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -561,7 +565,7 @@ func (it *CCIPSenderMessageSentIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPSenderMessageSent) + it.Event = new(CCIPSenderCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -576,32 +580,51 @@ func (it *CCIPSenderMessageSentIterator) Next() bool { } } -func (it *CCIPSenderMessageSentIterator) Error() error { +func (it *CCIPSenderCCIPRouterModifiedIterator) Error() error { return it.fail } -func (it *CCIPSenderMessageSentIterator) Close() error { +func (it *CCIPSenderCCIPRouterModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPSenderMessageSent struct { - MessageId [32]byte +type CCIPSenderCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address Raw types.Log } -func (_CCIPSender *CCIPSenderFilterer) FilterMessageSent(opts *bind.FilterOpts) (*CCIPSenderMessageSentIterator, error) { +func (_CCIPSender *CCIPSenderFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPSenderCCIPRouterModifiedIterator, error) { - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "MessageSent") + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } - return &CCIPSenderMessageSentIterator{contract: _CCIPSender.contract, event: "MessageSent", logs: logs, sub: sub}, nil + return &CCIPSenderCCIPRouterModifiedIterator{contract: _CCIPSender.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil } -func (_CCIPSender *CCIPSenderFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageSent) (event.Subscription, error) { +func (_CCIPSender *CCIPSenderFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPSenderCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "MessageSent") + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } @@ -611,8 +634,8 @@ func (_CCIPSender *CCIPSenderFilterer) WatchMessageSent(opts *bind.WatchOpts, si select { case log := <-logs: - event := new(CCIPSenderMessageSent) - if err := _CCIPSender.contract.UnpackLog(event, "MessageSent", log); err != nil { + event := new(CCIPSenderCCIPRouterModified) + if err := _CCIPSender.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return err } event.Raw = log @@ -633,17 +656,17 @@ func (_CCIPSender *CCIPSenderFilterer) WatchMessageSent(opts *bind.WatchOpts, si }), nil } -func (_CCIPSender *CCIPSenderFilterer) ParseMessageSent(log types.Log) (*CCIPSenderMessageSent, error) { - event := new(CCIPSenderMessageSent) - if err := _CCIPSender.contract.UnpackLog(event, "MessageSent", log); err != nil { +func (_CCIPSender *CCIPSenderFilterer) ParseCCIPRouterModified(log types.Log) (*CCIPSenderCCIPRouterModified, error) { + event := new(CCIPSenderCCIPRouterModified) + if err := _CCIPSender.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPSenderOwnershipTransferRequestedIterator struct { - Event *CCIPSenderOwnershipTransferRequested +type CCIPSenderChainAddedIterator struct { + Event *CCIPSenderChainAdded contract *bind.BoundContract event string @@ -654,7 +677,7 @@ type CCIPSenderOwnershipTransferRequestedIterator struct { fail error } -func (it *CCIPSenderOwnershipTransferRequestedIterator) Next() bool { +func (it *CCIPSenderChainAddedIterator) Next() bool { if it.fail != nil { return false @@ -663,7 +686,7 @@ func (it *CCIPSenderOwnershipTransferRequestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPSenderOwnershipTransferRequested) + it.Event = new(CCIPSenderChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -678,7 +701,7 @@ func (it *CCIPSenderOwnershipTransferRequestedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPSenderOwnershipTransferRequested) + it.Event = new(CCIPSenderChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -693,51 +716,34 @@ func (it *CCIPSenderOwnershipTransferRequestedIterator) Next() bool { } } -func (it *CCIPSenderOwnershipTransferRequestedIterator) Error() error { +func (it *CCIPSenderChainAddedIterator) Error() error { return it.fail } -func (it *CCIPSenderOwnershipTransferRequestedIterator) Close() error { +func (it *CCIPSenderChainAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPSenderOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log +type CCIPSenderChainAdded struct { + RemoteChainSelector uint64 + Recipient []byte + ExtraArgsBytes []byte + 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) - } +func (_CCIPSender *CCIPSenderFilterer) FilterChainAdded(opts *bind.FilterOpts) (*CCIPSenderChainAddedIterator, error) { - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ChainAdded") if err != nil { return nil, err } - return &CCIPSenderOwnershipTransferRequestedIterator{contract: _CCIPSender.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil + return &CCIPSenderChainAddedIterator{contract: _CCIPSender.contract, event: "ChainAdded", 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) - } +func (_CCIPSender *CCIPSenderFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainAdded) (event.Subscription, error) { - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ChainAdded") if err != nil { return nil, err } @@ -747,8 +753,8 @@ func (_CCIPSender *CCIPSenderFilterer) WatchOwnershipTransferRequested(opts *bin select { case log := <-logs: - event := new(CCIPSenderOwnershipTransferRequested) - if err := _CCIPSender.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + event := new(CCIPSenderChainAdded) + if err := _CCIPSender.contract.UnpackLog(event, "ChainAdded", log); err != nil { return err } event.Raw = log @@ -769,17 +775,17 @@ func (_CCIPSender *CCIPSenderFilterer) WatchOwnershipTransferRequested(opts *bin }), nil } -func (_CCIPSender *CCIPSenderFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPSenderOwnershipTransferRequested, error) { - event := new(CCIPSenderOwnershipTransferRequested) - if err := _CCIPSender.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { +func (_CCIPSender *CCIPSenderFilterer) ParseChainAdded(log types.Log) (*CCIPSenderChainAdded, error) { + event := new(CCIPSenderChainAdded) + if err := _CCIPSender.contract.UnpackLog(event, "ChainAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPSenderOwnershipTransferredIterator struct { - Event *CCIPSenderOwnershipTransferred +type CCIPSenderChainRemovedIterator struct { + Event *CCIPSenderChainRemoved contract *bind.BoundContract event string @@ -790,7 +796,7 @@ type CCIPSenderOwnershipTransferredIterator struct { fail error } -func (it *CCIPSenderOwnershipTransferredIterator) Next() bool { +func (it *CCIPSenderChainRemovedIterator) Next() bool { if it.fail != nil { return false @@ -799,7 +805,7 @@ func (it *CCIPSenderOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPSenderOwnershipTransferred) + it.Event = new(CCIPSenderChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -814,7 +820,7 @@ func (it *CCIPSenderOwnershipTransferredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPSenderOwnershipTransferred) + it.Event = new(CCIPSenderChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -829,51 +835,32 @@ func (it *CCIPSenderOwnershipTransferredIterator) Next() bool { } } -func (it *CCIPSenderOwnershipTransferredIterator) Error() error { +func (it *CCIPSenderChainRemovedIterator) Error() error { return it.fail } -func (it *CCIPSenderOwnershipTransferredIterator) Close() error { +func (it *CCIPSenderChainRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPSenderOwnershipTransferred struct { - From common.Address - To common.Address - Raw types.Log +type CCIPSenderChainRemoved struct { + RemoveChainSelector uint64 + 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) - } +func (_CCIPSender *CCIPSenderFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*CCIPSenderChainRemovedIterator, error) { - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ChainRemoved") if err != nil { return nil, err } - return &CCIPSenderOwnershipTransferredIterator{contract: _CCIPSender.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &CCIPSenderChainRemovedIterator{contract: _CCIPSender.contract, event: "ChainRemoved", 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) - } +func (_CCIPSender *CCIPSenderFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainRemoved) (event.Subscription, error) { - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ChainRemoved") if err != nil { return nil, err } @@ -883,8 +870,8 @@ func (_CCIPSender *CCIPSenderFilterer) WatchOwnershipTransferred(opts *bind.Watc select { case log := <-logs: - event := new(CCIPSenderOwnershipTransferred) - if err := _CCIPSender.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + event := new(CCIPSenderChainRemoved) + if err := _CCIPSender.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return err } event.Raw = log @@ -905,81 +892,751 @@ func (_CCIPSender *CCIPSenderFilterer) WatchOwnershipTransferred(opts *bind.Watc }), nil } -func (_CCIPSender *CCIPSenderFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPSenderOwnershipTransferred, error) { - event := new(CCIPSenderOwnershipTransferred) - if err := _CCIPSender.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { +func (_CCIPSender *CCIPSenderFilterer) ParseChainRemoved(log types.Log) (*CCIPSenderChainRemoved, error) { + event := new(CCIPSenderChainRemoved) + if err := _CCIPSender.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type SChainConfigs struct { - Disabled bool - Recipient []byte - ExtraArgsBytes []byte +type CCIPSenderMessageReceivedIterator struct { + Event *CCIPSenderMessageReceived + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -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) +func (it *CCIPSenderMessageReceivedIterator) Next() bool { - default: - return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + if it.fail != nil { + return false } -} -func (CCIPSenderMessageReceived) Topic() common.Hash { - return common.HexToHash("0xe29dc34207c78fc0f6048a32f159139c33339c6d6df8b07dcd33f6d699ff2327") -} + 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 -func (CCIPSenderMessageSent) Topic() common.Hash { - return common.HexToHash("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") -} + default: + return false + } + } -func (CCIPSenderOwnershipTransferRequested) Topic() common.Hash { - return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") -} + 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 -func (CCIPSenderOwnershipTransferred) Topic() common.Hash { - return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -func (_CCIPSender *CCIPSender) Address() common.Address { - return _CCIPSender.address +func (it *CCIPSenderMessageReceivedIterator) Error() error { + return it.fail } -type CCIPSenderInterface interface { - GetRouter(opts *bind.CallOpts) (common.Address, error) - - IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) +func (it *CCIPSenderMessageReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} - Owner(opts *bind.CallOpts) (common.Address, error) +type CCIPSenderMessageReceived struct { + MessageId [32]byte + Raw types.Log +} - SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, +func (_CCIPSender *CCIPSenderFilterer) FilterMessageReceived(opts *bind.FilterOpts) (*CCIPSenderMessageReceivedIterator, error) { - 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 +} - TypeAndVersion(opts *bind.CallOpts) (string, error) +func (_CCIPSender *CCIPSenderFilterer) WatchMessageReceived(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageReceived) (event.Subscription, error) { - AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, 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) + } - CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) + 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 CCIPSenderTokensWithdrawnByOwnerIterator struct { + Event *CCIPSenderTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPSenderTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPSenderTokensWithdrawnByOwner) + 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(CCIPSenderTokensWithdrawnByOwner) + 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 *CCIPSenderTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *CCIPSenderTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPSenderTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_CCIPSender *CCIPSenderFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPSenderTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } - DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &CCIPSenderTokensWithdrawnByOwnerIterator{contract: _CCIPSender.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_CCIPSender *CCIPSenderFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPSenderTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(CCIPSenderTokensWithdrawnByOwner) + if err := _CCIPSender.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*CCIPSenderTokensWithdrawnByOwner, error) { + event := new(CCIPSenderTokensWithdrawnByOwner) + if err := _CCIPSender.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChainConfigs struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPSender *CCIPSender) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPSender.abi.Events["ApprovedSenderModified"].ID: + return _CCIPSender.ParseApprovedSenderModified(log) + case _CCIPSender.abi.Events["CCIPRouterModified"].ID: + return _CCIPSender.ParseCCIPRouterModified(log) + case _CCIPSender.abi.Events["ChainAdded"].ID: + return _CCIPSender.ParseChainAdded(log) + case _CCIPSender.abi.Events["ChainRemoved"].ID: + return _CCIPSender.ParseChainRemoved(log) + 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) + case _CCIPSender.abi.Events["TokensWithdrawnByOwner"].ID: + return _CCIPSender.ParseTokensWithdrawnByOwner(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPSenderApprovedSenderModified) Topic() common.Hash { + return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +} + +func (CCIPSenderCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (CCIPSenderChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (CCIPSenderChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +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 (CCIPSenderTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + +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) + + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, + + error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) + + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) - EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -987,6 +1644,30 @@ type CCIPSenderInterface interface { Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderModifiedIterator, error) + + WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderModified(log types.Log) (*CCIPSenderApprovedSenderModified, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPSenderCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPSenderCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*CCIPSenderCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts) (*CCIPSenderChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*CCIPSenderChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*CCIPSenderChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*CCIPSenderChainRemoved, error) + FilterMessageReceived(opts *bind.FilterOpts) (*CCIPSenderMessageReceivedIterator, error) WatchMessageReceived(opts *bind.WatchOpts, sink chan<- *CCIPSenderMessageReceived) (event.Subscription, error) @@ -1011,6 +1692,12 @@ type CCIPSenderInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPSenderOwnershipTransferred, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPSenderTokensWithdrawnByOwnerIterator, error) + + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPSenderTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokensWithdrawnByOwner(log types.Log) (*CCIPSenderTokensWithdrawnByOwner, 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 6f043ea949..7fbdefc002 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,11 +30,18 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseApprovedSenderUpdate struct { +type CCIPBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -49,8 +56,8 @@ type ClientEVMTokenAmount struct { } var PingPongDemoMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620046c8380380620046c8833981016040819052620000349162000563565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c4816200013f565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013357620001336001600160a01b03821683600019620001ea565b50505050505062000688565b336001600160a01b03821603620001995760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002629190620005a2565b6200026e9190620005bc565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002ca91869190620002d016565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200031f906001600160a01b038516908490620003a6565b805190915015620003a15780806020019051810190620003409190620005e4565b620003a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003b78484600085620003bf565b949350505050565b606082471015620004225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b0316858760405162000440919062000635565b60006040518083038185875af1925050503d80600081146200047f576040519150601f19603f3d011682016040523d82523d6000602084013e62000484565b606091505b5090925090506200049887838387620004a3565b979650505050505050565b60608315620005175782516000036200050f576001600160a01b0385163b6200050f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003b7565b620003b783838151156200052e5781518083602001fd5b8060405162461bcd60e51b815260040162000088919062000653565b6001600160a01b03811681146200056057600080fd5b50565b600080604083850312156200057757600080fd5b825162000584816200054a565b602084015190925062000597816200054a565b809150509250929050565b600060208284031215620005b557600080fd5b5051919050565b80820180821115620005de57634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f757600080fd5b815180151581146200060857600080fd5b9392505050565b60005b838110156200062c57818101518382015260200162000612565b50506000910152565b60008251620006498184602087016200060f565b9190910192915050565b6020815260008251806020840152620006748160408501602087016200060f565b601f01601f19169190910160400192915050565b608051613ffa620006ce6000396000818161057e01528181610759015281816107e90152818161137301528181612034015281816120fd01526121d50152613ffa6000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b5a1101111610095578063e4ca875411610064578063e4ca875414610663578063e89b448514610683578063f2fde38b14610696578063ff2deec3146106b657600080fd5b8063b5a11011146105da578063bee518a4146105fa578063cf6730f814610623578063d8469e401461064357600080fd5b80638da5cb5b116100d15780638da5cb5b146105245780639d2aede51461054f578063b0f479a11461056f578063b187bd26146105a257600080fd5b80636fef519e1461048657806379ba5097146104cf5780638462a2b9146104e457806385572ffb1461050457600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f95780635e35359e146104195780636939cd97146104395780636d62d6331461046657600080fd5b80632b6e5d631461032457806335f170ef1461037c57806341eade46146103ab5780635075a9d4146103cb57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004612eef565b60086020526000908152604090205460ff1681565b6040516102259190612f08565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612fa8565b6106e3565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461301f565b61072e565b005b34801561028c57600080fd5b5061027e61029b36600461304a565b6108a6565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906130d5565b3480156102fb57600080fd5b5061027e61030a3660046130e8565b610900565b34801561031b57600080fd5b5061027e610943565b34801561033057600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046130e8565b61097f565b60405161022593929190613105565b3480156103b757600080fd5b5061027e6103c63660046130e8565b610ab6565b3480156103d757600080fd5b506103eb6103e6366004612eef565b610b01565b604051908152602001610225565b34801561040557600080fd5b5061027e61041436600461313c565b610b14565b34801561042557600080fd5b5061027e610434366004613168565b610b2a565b34801561044557600080fd5b50610459610454366004612eef565b610b58565b6040516102259190613206565b34801561047257600080fd5b5061027e6104813660046132a3565b610d63565b34801561049257600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104db57600080fd5b5061027e61107d565b3480156104f057600080fd5b5061027e6104ff366004613318565b61117a565b34801561051057600080fd5b5061027e61051f366004613384565b61135b565b34801561053057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055b57600080fd5b5061027e61056a36600461301f565b611656565b34801561057b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156105ae57600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105e657600080fd5b5061027e6105f53660046133bf565b611710565b34801561060657600080fd5b5060095460405167ffffffffffffffff9091168152602001610225565b34801561062f57600080fd5b5061027e61063e366004613384565b611883565b34801561064f57600080fd5b5061027e61065e3660046133ed565b611a70565b34801561066f57600080fd5b5061027e61067e366004612eef565b611aef565b6103eb6106913660046135a5565b611d59565b3480156106a257600080fd5b5061027e6106b136600461301f565b6122dd565b3480156106c257600080fd5b506007546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260026020526040808220905160039091019061071290859085906136b2565b9081526040519081900360200190205460ff1690509392505050565b6107366122f1565b60075473ffffffffffffffffffffffffffffffffffffffff1615610799576107997f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16906000612372565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610848576108487f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612572565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108ae6122f1565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109086122f1565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61094b6122f1565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905561097d6001612676565b565b6002602052600090815260409020805460018201805460ff90921692916109a5906136c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906136c2565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806002018054610a33906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f906136c2565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905083565b610abe6122f1565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610b0e600483612783565b92915050565b610b1c6122f1565b610b268282612796565b5050565b610b326122f1565b610b5373ffffffffffffffffffffffffffffffffffffffff841683836128f0565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610bc7906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf3906136c2565b8015610c405780601f10610c1557610100808354040283529160200191610c40565b820191906000526020600020905b815481529060010190602001808311610c2357829003601f168201915b50505050508152602001600382018054610c59906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c85906136c2565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d555760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d00565b505050915250909392505050565b610d6b6122f1565b6001610d78600484612783565b14610db7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610dc78260025b60049190612946565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e0f906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b906136c2565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b50505050508152602001600382018054610ea1906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecd906136c2565b8015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f9d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f48565b5050505081525050905060005b81608001515181101561102c576110248383608001518381518110610fd157610fd1613715565b60200260200101516020015184608001518481518110610ff357610ff3613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128f09092919063ffffffff16565b600101610faa565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610dae565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111826122f1565b60005b8181101561126557600260008484848181106111a3576111a3613715565b90506020028101906111b59190613744565b6111c39060208101906130e8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106111fa576111fa613715565b905060200281019061120c9190613744565b61121a906020810190613782565b6040516112289291906136b2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611185565b5060005b838110156113545760016002600087878581811061128957611289613715565b905060200281019061129b9190613744565b6112a99060208101906130e8565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106112e0576112e0613715565b90506020028101906112f29190613744565b611300906020810190613782565b60405161130e9291906136b2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611269565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113cc576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610dae565b6113dc60408201602083016130e8565b6113e96040830183613782565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061144792508491506137e7565b9081526040519081900360200190205460ff1661149257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b6114a260408401602085016130e8565b67ffffffffffffffff811660009081526002602052604090206001810180546114ca906136c2565b159050806114d95750805460ff165b1561151c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115589088906004016138fb565b600060405180830381600087803b15801561157257600080fd5b505af1925050508015611583575060015b611623573d8080156115b1576040519150601f19603f3d011682016040523d82523d6000602084013e6115b6565b606091505b506115c386356001610dbe565b508535600090815260036020526040902086906115e08282613ccd565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116159084906130d5565b60405180910390a250611354565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61165e6122f1565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610b269082613dc7565b6117186122f1565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526117d3916137e7565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610b539082613dc7565b3330146118bc576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118cc60408201602083016130e8565b6118d96040830183613782565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600260205260409081902090516003909101935061193792508491506137e7565b9081526040519081900360200190205460ff1661198257806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b61199260408401602085016130e8565b67ffffffffffffffff811660009081526002602052604090206001810180546119ba906136c2565b159050806119c95750805460ff165b15611a0c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6000611a1b6060870187613782565b810190611a289190612eef565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611a6857611a68611a63826001613ee1565b612676565b505050505050565b611a786122f1565b67ffffffffffffffff8516600090815260026020526040902060018101611aa0858783613a51565b508115611ab85760028101611ab6838583613a51565b505b805460ff1615611a685780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611afc600483612783565b14611b36576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610dae565b611b41816000610dbe565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b89906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb5906136c2565b8015611c025780601f10611bd757610100808354040283529160200191611c02565b820191906000526020600020905b815481529060010190602001808311611be557829003601f168201915b50505050508152602001600382018054611c1b906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c47906136c2565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611d175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611cc2565b50505050815250509050611d2a8161295b565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260026020526040812060018101805486929190611d85906136c2565b15905080611d945750805460ff165b15611dd7576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610dae565b6040805160a08101825267ffffffffffffffff8816600090815260026020529182206001018054829190611e0a906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e36906136c2565b8015611e835780601f10611e5857610100808354040283529160200191611e83565b820191906000526020600020905b815481529060010190602001808311611e6657829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260029283905220018054608090920191611ee2906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0e906136c2565b8015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050815250905060005b86518110156120bc57611fd83330898481518110611f8857611f88613715565b6020026020010151602001518a8581518110611fa657611fa6613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612963909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061200857612008613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120b4576120b47f000000000000000000000000000000000000000000000000000000000000000088838151811061206557612065613715565b60200260200101516020015189848151811061208357612083613715565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125729092919063ffffffff16565b600101611f68565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded90612134908b908690600401613ef4565b602060405180830381865afa158015612151573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121759190613fb7565b60075490915073ffffffffffffffffffffffffffffffffffffffff16156121bb576007546121bb9073ffffffffffffffffffffffffffffffffffffffff16333084612963565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f991161561220a57600061220c565b825b8a856040518463ffffffff1660e01b815260040161222b929190613ef4565b60206040518083038185885af1158015612249573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226e9190613fb7565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6122e56122f1565b6122ee816129c1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610dae565b80158061241257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190613fb7565b155b61249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612ab6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260d9190613fb7565b6126179190613ee1565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126709085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016124f0565b50505050565b806001166001036126b9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ed565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270291815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600954600080855260208501909352909350610b539267ffffffffffffffff9091169161277c565b60408051808201909152600080825260208201528152602001906001900390816127555790505b5083611d59565b600061278f8383612bc2565b9392505050565b80471015612800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dae565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461285a576040519150601f19603f3d011682016040523d82523d6000602084013e61285f565b606091505b5050905080610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dae565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b539084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124f0565b6000612953848484612c4c565b949350505050565b6122ee6122f1565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126709085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016124f0565b3373ffffffffffffffffffffffffffffffffffffffff821603612a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610dae565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b18826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c699092919063ffffffff16565b805190915015610b535780806020019051810190612b369190613fd0565b610b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dae565b600081815260028301602052604081205480151580612be65750612be68484612c78565b61278f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610dae565b600082815260028401602052604081208290556129538484612c84565b60606129538484600085612c90565b600061278f8383612da9565b600061278f8383612dc1565b606082471015612d22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dae565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d4b91906137e7565b60006040518083038185875af1925050503d8060008114612d88576040519150601f19603f3d011682016040523d82523d6000602084013e612d8d565b606091505b5091509150612d9e87838387612e10565b979650505050505050565b6000818152600183016020526040812054151561278f565b6000818152600183016020526040812054612e0857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0e565b506000610b0e565b60608315612ea6578251600003612e9f5773ffffffffffffffffffffffffffffffffffffffff85163b612e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dae565b5081612953565b6129538383815115612ebb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae91906130d5565b600060208284031215612f0157600080fd5b5035919050565b6020810160038310612f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146122ee57600080fd5b60008083601f840112612f7157600080fd5b50813567ffffffffffffffff811115612f8957600080fd5b602083019150836020828501011115612fa157600080fd5b9250929050565b600080600060408486031215612fbd57600080fd5b8335612fc881612f49565b9250602084013567ffffffffffffffff811115612fe457600080fd5b612ff086828701612f5f565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122ee57600080fd5b60006020828403121561303157600080fd5b813561278f81612ffd565b80151581146122ee57600080fd5b60006020828403121561305c57600080fd5b813561278f8161303c565b60005b8381101561308257818101518382015260200161306a565b50506000910152565b600081518084526130a3816020860160208601613067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061278f602083018461308b565b6000602082840312156130fa57600080fd5b813561278f81612f49565b8315158152606060208201526000613120606083018561308b565b8281036040840152613132818561308b565b9695505050505050565b6000806040838503121561314f57600080fd5b823561315a81612ffd565b946020939093013593505050565b60008060006060848603121561317d57600080fd5b833561318881612ffd565b9250602084013561319881612ffd565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156131fb578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016131be565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261324060c084018261308b565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261327c838361308b565b925060808601519150808584030160a08601525061329a82826131a9565b95945050505050565b600080604083850312156132b657600080fd5b8235915060208301356132c881612ffd565b809150509250929050565b60008083601f8401126132e557600080fd5b50813567ffffffffffffffff8111156132fd57600080fd5b6020830191508360208260051b8501011115612fa157600080fd5b6000806000806040858703121561332e57600080fd5b843567ffffffffffffffff8082111561334657600080fd5b613352888389016132d3565b9096509450602087013591508082111561336b57600080fd5b50613378878288016132d3565b95989497509550505050565b60006020828403121561339657600080fd5b813567ffffffffffffffff8111156133ad57600080fd5b820160a0818503121561278f57600080fd5b600080604083850312156133d257600080fd5b82356133dd81612f49565b915060208301356132c881612ffd565b60008060008060006060868803121561340557600080fd5b853561341081612f49565b9450602086013567ffffffffffffffff8082111561342d57600080fd5b61343989838a01612f5f565b9096509450604088013591508082111561345257600080fd5b5061345f88828901612f5f565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156134c2576134c2613470565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561350f5761350f613470565b604052919050565b600082601f83011261352857600080fd5b813567ffffffffffffffff81111561354257613542613470565b61357360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134c8565b81815284602083860101111561358857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156135ba57600080fd5b83356135c581612f49565b925060208481013567ffffffffffffffff808211156135e357600080fd5b818701915087601f8301126135f757600080fd5b81358181111561360957613609613470565b613617848260051b016134c8565b81815260069190911b8301840190848101908a83111561363657600080fd5b938501935b82851015613682576040858c0312156136545760008081fd5b61365c61349f565b853561366781612ffd565b8152858701358782015282526040909401939085019061363b565b96505050604087013592508083111561369a57600080fd5b50506136a886828701613517565b9150509250925092565b8183823760009101908152919050565b600181811c908216806136d657607f821691505b60208210810361370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261377857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b757600080fd5b83018035915067ffffffffffffffff8211156137d257600080fd5b602001915036819003821315612fa157600080fd5b60008251613778818460208701613067565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261382e57600080fd5b830160208101925035905067ffffffffffffffff81111561384e57600080fd5b803603821315612fa157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156131fb5781356138c981612ffd565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016138b6565b60208152813560208201526000602083013561391681612f49565b67ffffffffffffffff808216604085015261393460408601866137f9565b925060a0606086015261394b60c08601848361385d565b92505061395b60608601866137f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261399185838561385d565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126139ca57600080fd5b602092880192830192359150838211156139e357600080fd5b8160061b36038313156139f557600080fd5b8685030160a0870152612d9e8482846138a6565b601f821115610b53576000816000526020600020601f850160051c81016020861015613a325750805b601f850160051c820191505b81811015611a6857828155600101613a3e565b67ffffffffffffffff831115613a6957613a69613470565b613a7d83613a7783546136c2565b83613a09565b6000601f841160018114613acf5760008515613a995750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611354565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b1e5786850135825560209485019460019092019101613afe565b5086821015613b59577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613ba581612ffd565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c0b57613c0b613470565b805483825580841015613c985760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613c4c57613c4c613b6b565b8086168614613c5d57613c5d613b6b565b5060008360005260206000208360011b81018760011b820191505b80821015613c93578282558284830155600282019150613c78565b505050505b5060008181526020812083915b85811015611a6857613cb78383613b9a565b6040929092019160029190910190600101613ca5565b81358155600181016020830135613ce381612f49565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d236040860186613782565b93509150613d35838360028701613a51565b613d426060860186613782565b93509150613d54838360038701613a51565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613d8b57600080fd5b918401918235915080821115613da057600080fd5b506020820191508060061b3603821315613db957600080fd5b612670818360048601613bf2565b815167ffffffffffffffff811115613de157613de1613470565b613df581613def84546136c2565b84613a09565b602080601f831160018114613e485760008415613e125750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611a68565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e9557888601518255948401946001909101908401613e76565b5085821015613ed157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610b0e57610b0e613b6b565b67ffffffffffffffff83168152604060208201526000825160a06040840152613f2060e084018261308b565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613f5c838361308b565b92506040860151915080858403016080860152613f7983836131a9565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613132828261308b565b600060208284031215613fc957600080fd5b5051919050565b600060208284031215613fe257600080fd5b815161278f8161303c56fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004c9b38038062004c9b833981016040819052620000349162000571565b81818181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200014d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b03821683600019620001f8565b505050505050505062000696565b336001600160a01b03821603620001a75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002709190620005b0565b6200027c9190620005ca565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d891869190620002de16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032d906001600160a01b038516908490620003b4565b805190915015620003af57808060200190518101906200034e9190620005f2565b620003af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003c58484600085620003cd565b949350505050565b606082471015620004305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200044e919062000643565b60006040518083038185875af1925050503d80600081146200048d576040519150601f19603f3d011682016040523d82523d6000602084013e62000492565b606091505b509092509050620004a687838387620004b1565b979650505050505050565b60608315620005255782516000036200051d576001600160a01b0385163b6200051d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003c5565b620003c583838151156200053c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000661565b6001600160a01b03811681146200056e57600080fd5b50565b600080604083850312156200058557600080fd5b8251620005928162000558565b6020840151909250620005a58162000558565b809150509250929050565b600060208284031215620005c357600080fd5b5051919050565b80820180821115620005ec57634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060557600080fd5b815180151581146200061657600080fd5b9392505050565b60005b838110156200063a57818101518382015260200162000620565b50506000910152565b60008251620006578184602087016200061d565b9190910192915050565b6020815260008251806020840152620006828160408501602087016200061d565b601f01601f19169190910160400192915050565b6145f580620006a66000396000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b187bd2611610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063b187bd26146105b9578063b5a11011146105f1578063bee518a414610611578063cf6730f81461063a57600080fd5b80638da5cb5b116100d15780638da5cb5b146105235780639d2aede51461054e5780639fe74e261461056e578063b0f479a11461058e57600080fd5b80636fef519e1461048557806379ba5097146104ce5780638462a2b9146104e357806385572ffb1461050357600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f85780635e35359e146104185780636939cd97146104385780636d62d6331461046557600080fd5b80632b6e5d631461032457806335f170ef1461037c5780634e12498b146103aa5780635075a9d4146103ca57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102186102033660046134ce565b60096020526000908152604090205460ff1681565b60405161022591906134e7565b60405180910390f35b34801561023a57600080fd5b5061024e61024936600461353e565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e6102793660046135e5565b610725565b005b34801561028c57600080fd5b5061027e61029b366004613610565b610899565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b604051610225919061369b565b3480156102fb57600080fd5b5061027e61030a3660046136ae565b6108f3565b34801561031b57600080fd5b5061027e610936565b34801561033057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046136ae565b610972565b6040516102259291906136cb565b3480156103b657600080fd5b5061027e6103c53660046135e5565b610a9e565b3480156103d657600080fd5b506103ea6103e53660046134ce565b610b6a565b604051908152602001610225565b34801561040457600080fd5b5061027e6104133660046136f9565b610b7d565b34801561042457600080fd5b5061027e610433366004613725565b610be1565b34801561044457600080fd5b506104586104533660046134ce565b610c76565b60405161022591906137c3565b34801561047157600080fd5b5061027e610480366004613857565b610e81565b34801561049157600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104da57600080fd5b5061027e61119b565b3480156104ef57600080fd5b5061027e6104fe3660046138d3565b611298565b34801561050f57600080fd5b5061027e61051e36600461393f565b6115f9565b34801561052f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055a57600080fd5b5061027e6105693660046135e5565b611906565b34801561057a57600080fd5b5061027e61058936600461397a565b6119c1565b34801561059a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610357565b3480156105c557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105fd57600080fd5b5061027e61060c3660046139bc565b611d41565b34801561061d57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561064657600080fd5b5061027e61065536600461393f565b611eb1565b34801561066657600080fd5b5061027e6106753660046134ce565b6120ce565b6103ea610688366004613b1f565b612338565b34801561069957600080fd5b5061027e6106a83660046135e5565b61286e565b3480156106b957600080fd5b506008546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613c2c565b9081526040519081900360200190205460ff1690509392505050565b61072d612882565b60085473ffffffffffffffffffffffffffffffffffffffff161561078e5761078e61076d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612903565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561083b5761083b6107fb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b03565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108a1612882565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6108fb612882565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61093e612882565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109706001612c07565b565b60036020526000908152604090208054819061098d90613c3c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990613c3c565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505090806001018054610a1b90613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613c3c565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905082565b610aa6612882565b73ffffffffffffffffffffffffffffffffffffffff8116610af3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610b77600583612d14565b92915050565b610b85612882565b610b8f8282612d27565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610be9612882565b610c0a73ffffffffffffffffffffffffffffffffffffffff84168383612e81565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610c6991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ce590613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190613c3c565b8015610d5e5780601f10610d3357610100808354040283529160200191610d5e565b820191906000526020600020905b815481529060010190602001808311610d4157829003601f168201915b50505050508152602001600382018054610d7790613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613c3c565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e1e565b505050915250909392505050565b610e89612882565b6001610e96600584612d14565b14610ed5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ee58260025b60059190612ed7565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f2d90613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990613c3c565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b50505050508152602001600382018054610fbf90613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb90613c3c565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110bb5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611066565b5050505081525050905060005b81608001515181101561114a5761114283836080015183815181106110ef576110ef613c8f565b6020026020010151602001518460800151848151811061111157611111613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e819092919063ffffffff16565b6001016110c8565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ecc565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112a0612882565b60005b8181101561144357600360008484848181106112c1576112c1613c8f565b90506020028101906112d39190613cbe565b6112e19060208101906136ae565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061131857611318613c8f565b905060200281019061132a9190613cbe565b611338906020810190613cfc565b604051611346929190613c2c565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061138d5761138d613c8f565b905060200281019061139f9190613cbe565b6113ad906020810190613cfc565b6040516113bb929190613c2c565b60405180910390208383838181106113d5576113d5613c8f565b90506020028101906113e79190613cbe565b6113f59060208101906136ae565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611433911515815260200190565b60405180910390a36001016112a3565b5060005b838110156115f25760016003600087878581811061146757611467613c8f565b90506020028101906114799190613cbe565b6114879060208101906136ae565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106114be576114be613c8f565b90506020028101906114d09190613cbe565b6114de906020810190613cfc565b6040516114ec929190613c2c565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061153c5761153c613c8f565b905060200281019061154e9190613cbe565b61155c906020810190613cfc565b60405161156a929190613c2c565b604051809103902085858381811061158457611584613c8f565b90506020028101906115969190613cbe565b6115a49060208101906136ae565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516115e2911515815260200190565b60405180910390a3600101611447565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461164c576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ecc565b61165c60408201602083016136ae565b6116696040830183613cfc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116c092509050613c3c565b159050806117165750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117019190613d61565b9081526040519081900360200190205460ff16155b1561174f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc919061369b565b61175f60408401602085016136ae565b67ffffffffffffffff811660009081526003602052604090208054819061178590613c3c565b90506000036117cc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611808908890600401613e75565b600060405180830381600087803b15801561182257600080fd5b505af1925050508015611833575060015b6118d3573d808015611861576040519150601f19603f3d011682016040523d82523d6000602084013e611866565b606091505b5061187386356001610edc565b508535600090815260046020526040902086906118908282614247565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906118c590849061369b565b60405180910390a2506115f2565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61190e612882565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906119bd9082614341565b5050565b6119c9612882565b60005b81811015611d3c578282828181106119e6576119e6613c8f565b90506020028101906119f8919061445b565b611a09906040810190602001613610565b611adc5760036000848484818110611a2357611a23613c8f565b9050602002810190611a35919061445b565b611a439060208101906136ae565b67ffffffffffffffff16815260208101919091526040016000908120611a6891613480565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916838383818110611a9b57611a9b613c8f565b9050602002810190611aad919061445b565b611abb9060208101906136ae565b60405167ffffffffffffffff909116815260200160405180910390a1611d34565b828282818110611aee57611aee613c8f565b9050602002810190611b00919061445b565b611b0e906040810190613cfc565b9050600003611b49576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611b6157611b61613c8f565b9050602002810190611b73919061445b565b611b819060208101906136ae565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611bb757611bb7613c8f565b9050602002810190611bc9919061445b565b611bd7906040810190613cfc565b8291611be4919083613fcb565b50838383818110611bf757611bf7613c8f565b9050602002810190611c09919061445b565b611c17906060810190613cfc565b159050611c6257838383818110611c3057611c30613c8f565b9050602002810190611c42919061445b565b611c50906060810190613cfc565b6001830191611c60919083613fcb565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212848484818110611c9557611c95613c8f565b9050602002810190611ca7919061445b565b611cb59060208101906136ae565b858585818110611cc757611cc7613c8f565b9050602002810190611cd9919061445b565b611ce7906040810190613cfc565b878787818110611cf957611cf9613c8f565b9050602002810190611d0b919061445b565b611d19906060810190613cfc565b604051611d2a95949392919061448f565b60405180910390a1505b6001016119cc565b505050565b611d49612882565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611e0491613d61565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611d3c9082614341565b333014611eea576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611efa60408201602083016136ae565b611f076040830183613cfc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611f5e92509050613c3c565b15905080611fb45750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611f9f9190613d61565b9081526040519081900360200190205460ff16155b15611fed57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc919061369b565b611ffd60408401602085016136ae565b67ffffffffffffffff811660009081526003602052604090208054819061202390613c3c565b905060000361206a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b60006120796060870187613cfc565b81019061208691906134ce565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff166120c6576120c66120c18260016144d2565b612c07565b505050505050565b60016120db600583612d14565b14612115576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ecc565b612120816000610edc565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161216890613c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461219490613c3c565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505081526020016003820180546121fa90613c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461222690613c3c565b80156122735780601f1061224857610100808354040283529160200191612273565b820191906000526020600020905b81548152906001019060200180831161225657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156122f65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016122a1565b5050505081525050905061230981612eec565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061236190613c3c565b90506000036123a8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906123d890613c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461240490613c3c565b80156124515780601f1061242657610100808354040283529160200191612451565b820191906000526020600020905b81548152906001019060200180831161243457829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916124b290613c3c565b80601f01602080910402602001604051908101604052809291908181526020018280546124de90613c3c565b801561252b5780601f106125005761010080835404028352916020019161252b565b820191906000526020600020905b81548152906001019060200180831161250e57829003601f168201915b5050505050815250905060005b8651811015612688576125a8333089848151811061255857612558613c8f565b6020026020010151602001518a858151811061257657612576613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ef4909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106125d8576125d8613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126805760025487516126809173ffffffffffffffffffffffffffffffffffffffff169089908490811061263157612631613c8f565b60200260200101516020015189848151811061264f5761264f613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129039092919063ffffffff16565b600101612538565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906126e2908b9086906004016144e5565b602060405180830381865afa1580156126ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272391906145b2565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612769576008546127699073ffffffffffffffffffffffffffffffffffffffff16333084612ef4565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561279b57600061279d565b825b8a856040518463ffffffff1660e01b81526004016127bc9291906144e5565b60206040518083038185885af11580156127da573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127ff91906145b2565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612876612882565b61287f81612f52565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ecc565b8015806129a357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a191906145b2565b155b612a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d3c9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613047565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9e91906145b2565b612ba891906144d2565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612c019085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a81565b50505050565b80600116600103612c4a576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612c7e565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b600081604051602001612c9391815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a54600080855260208501909352909350611d3c9267ffffffffffffffff90911691612d0d565b6040805180820190915260008082526020820152815260200190600190039081612ce65790505b5083612338565b6000612d208383613153565b9392505050565b80471015612d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ecc565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612deb576040519150601f19603f3d011682016040523d82523d6000602084013e612df0565b606091505b5050905080611d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d3c9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a81565b6000612ee48484846131dd565b949350505050565b61287f612882565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612c019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a81565b3373ffffffffffffffffffffffffffffffffffffffff821603612fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ecc565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006130a9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131fa9092919063ffffffff16565b805190915015611d3c57808060200190518101906130c791906145cb565b611d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecc565b60008181526002830160205260408120548015158061317757506131778484613209565b612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ecc565b60008281526002840160205260408120829055612ee48484613215565b6060612ee48484600085613221565b6000612d20838361333a565b6000612d208383613352565b6060824710156132b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ecc565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132dc9190613d61565b60006040518083038185875af1925050503d8060008114613319576040519150601f19603f3d011682016040523d82523d6000602084013e61331e565b606091505b509150915061332f878383876133a1565b979650505050505050565b60008181526001830160205260408120541515612d20565b600081815260018301602052604081205461339957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b77565b506000610b77565b606083156134375782516000036134305773ffffffffffffffffffffffffffffffffffffffff85163b613430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecc565b5081612ee4565b612ee4838381511561344c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc919061369b565b50805461348c90613c3c565b6000825580601f1061349c575050565b601f01602090049060005260206000209081019061287f91905b808211156134ca57600081556001016134b6565b5090565b6000602082840312156134e057600080fd5b5035919050565b6020810160038310613522577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461287f57600080fd5b60008060006040848603121561355357600080fd5b833561355e81613528565b9250602084013567ffffffffffffffff8082111561357b57600080fd5b818601915086601f83011261358f57600080fd5b81358181111561359e57600080fd5b8760208285010111156135b057600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff8116811461287f57600080fd5b6000602082840312156135f757600080fd5b8135612d20816135c3565b801515811461287f57600080fd5b60006020828403121561362257600080fd5b8135612d2081613602565b60005b83811015613648578181015183820152602001613630565b50506000910152565b6000815180845261366981602086016020860161362d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d206020830184613651565b6000602082840312156136c057600080fd5b8135612d2081613528565b6040815260006136de6040830185613651565b82810360208401526136f08185613651565b95945050505050565b6000806040838503121561370c57600080fd5b8235613717816135c3565b946020939093013593505050565b60008060006060848603121561373a57600080fd5b8335613745816135c3565b92506020840135613755816135c3565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156137b8578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161377b565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526137fd60c0840182613651565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526138398383613651565b925060808601519150808584030160a0860152506136f08282613766565b6000806040838503121561386a57600080fd5b82359150602083013561387c816135c3565b809150509250929050565b60008083601f84011261389957600080fd5b50813567ffffffffffffffff8111156138b157600080fd5b6020830191508360208260051b85010111156138cc57600080fd5b9250929050565b600080600080604085870312156138e957600080fd5b843567ffffffffffffffff8082111561390157600080fd5b61390d88838901613887565b9096509450602087013591508082111561392657600080fd5b5061393387828801613887565b95989497509550505050565b60006020828403121561395157600080fd5b813567ffffffffffffffff81111561396857600080fd5b820160a08185031215612d2057600080fd5b6000806020838503121561398d57600080fd5b823567ffffffffffffffff8111156139a457600080fd5b6139b085828601613887565b90969095509350505050565b600080604083850312156139cf57600080fd5b82356139da81613528565b9150602083013561387c816135c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a3c57613a3c6139ea565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a8957613a896139ea565b604052919050565b600082601f830112613aa257600080fd5b813567ffffffffffffffff811115613abc57613abc6139ea565b613aed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a42565b818152846020838601011115613b0257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b3457600080fd5b8335613b3f81613528565b925060208481013567ffffffffffffffff80821115613b5d57600080fd5b818701915087601f830112613b7157600080fd5b813581811115613b8357613b836139ea565b613b91848260051b01613a42565b81815260069190911b8301840190848101908a831115613bb057600080fd5b938501935b82851015613bfc576040858c031215613bce5760008081fd5b613bd6613a19565b8535613be1816135c3565b81528587013587820152825260409094019390850190613bb5565b965050506040870135925080831115613c1457600080fd5b5050613c2286828701613a91565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613c5057607f821691505b602082108103613c89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613cf257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d3157600080fd5b83018035915067ffffffffffffffff821115613d4c57600080fd5b6020019150368190038213156138cc57600080fd5b60008251613cf281846020870161362d565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613da857600080fd5b830160208101925035905067ffffffffffffffff811115613dc857600080fd5b8036038213156138cc57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156137b8578135613e43816135c3565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613e30565b602081528135602082015260006020830135613e9081613528565b67ffffffffffffffff8082166040850152613eae6040860186613d73565b925060a06060860152613ec560c086018483613dd7565b925050613ed56060860186613d73565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f0b858385613dd7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613f4457600080fd5b60209288019283019235915083821115613f5d57600080fd5b8160061b3603831315613f6f57600080fd5b8685030160a087015261332f848284613e20565b601f821115611d3c576000816000526020600020601f850160051c81016020861015613fac5750805b601f850160051c820191505b818110156120c657828155600101613fb8565b67ffffffffffffffff831115613fe357613fe36139ea565b613ff783613ff18354613c3c565b83613f83565b6000601f84116001811461404957600085156140135750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115f2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140985786850135825560209485019460019092019101614078565b50868210156140d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561411f816135c3565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115614185576141856139ea565b8054838255808410156142125760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146141c6576141c66140e5565b80861686146141d7576141d76140e5565b5060008360005260206000208360011b81018760011b820191505b8082101561420d5782825582848301556002820191506141f2565b505050505b5060008181526020812083915b858110156120c6576142318383614114565b604092909201916002919091019060010161421f565b8135815560018101602083013561425d81613528565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561429d6040860186613cfc565b935091506142af838360028701613fcb565b6142bc6060860186613cfc565b935091506142ce838360038701613fcb565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261430557600080fd5b91840191823591508082111561431a57600080fd5b506020820191508060061b360382131561433357600080fd5b612c0181836004860161416c565b815167ffffffffffffffff81111561435b5761435b6139ea565b61436f816143698454613c3c565b84613f83565b602080601f8311600181146143c2576000841561438c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556120c6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561440f578886015182559484019460019091019084016143f0565b508582101561444b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613cf257600080fd5b67ffffffffffffffff861681526060602082015260006144b3606083018688613dd7565b82810360408401526144c6818587613dd7565b98975050505050505050565b80820180821115610b7757610b776140e5565b67ffffffffffffffff83168152604060208201526000825160a0604084015261451160e0840182613651565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261454d8383613651565b9250604086015191508085840301608086015261456a8383613766565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145a88282613651565b9695505050505050565b6000602082840312156145c457600080fd5b5051919050565b6000602082840312156145dd57600080fd5b8151612d208161360256fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -189,25 +196,25 @@ func (_PingPongDemo *PingPongDemoTransactorRaw) Transact(opts *bind.TransactOpts return _PingPongDemo.Contract.contract.Transact(opts, method, params...) } -func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) { +func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { - return *new([]byte), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -func (_PingPongDemo *PingPongDemoSession) ACKMESSAGEHEADER() ([]byte, error) { +func (_PingPongDemo *PingPongDemoSession) ACKMESSAGEHEADER() (string, error) { return _PingPongDemo.Contract.ACKMESSAGEHEADER(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCallerSession) ACKMESSAGEHEADER() ([]byte, error) { +func (_PingPongDemo *PingPongDemoCallerSession) ACKMESSAGEHEADER() (string, error) { return _PingPongDemo.Contract.ACKMESSAGEHEADER(&_PingPongDemo.CallOpts) } @@ -398,9 +405,8 @@ func (_PingPongDemo *PingPongDemoCaller) SChainConfigs(opts *bind.CallOpts, dest return *outstruct, err } - 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) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) return *outstruct, err @@ -508,6 +514,18 @@ func (_PingPongDemo *PingPongDemoTransactorSession) AcceptOwnership() (*types.Tr return _PingPongDemo.Contract.AcceptOwnership(&_PingPongDemo.TransactOpts) } +func (_PingPongDemo *PingPongDemoTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "applyChainUpdates", chains) +} + +func (_PingPongDemo *PingPongDemoSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.ApplyChainUpdates(&_PingPongDemo.TransactOpts, chains) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.ApplyChainUpdates(&_PingPongDemo.TransactOpts, chains) +} + func (_PingPongDemo *PingPongDemoTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "ccipReceive", message) } @@ -532,30 +550,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) CcipSend(destChainSelector u return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data) } -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) } @@ -568,6 +562,18 @@ func (_PingPongDemo *PingPongDemoTransactorSession) ModifyFeeToken(token common. return _PingPongDemo.Contract.ModifyFeeToken(&_PingPongDemo.TransactOpts, token) } +func (_PingPongDemo *PingPongDemoTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "modifyRouter", newRouter) +} + +func (_PingPongDemo *PingPongDemoSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.ModifyRouter(&_PingPongDemo.TransactOpts, newRouter) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.ModifyRouter(&_PingPongDemo.TransactOpts, newRouter) +} + func (_PingPongDemo *PingPongDemoTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "processMessage", message) } @@ -636,80 +642,589 @@ func (_PingPongDemo *PingPongDemoSession) SetPaused(pause bool) (*types.Transact return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) } -func (_PingPongDemo *PingPongDemoTransactorSession) SetPaused(pause bool) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) -} +func (_PingPongDemo *PingPongDemoTransactorSession) SetPaused(pause bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) +} + +func (_PingPongDemo *PingPongDemoTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "startPingPong") +} + +func (_PingPongDemo *PingPongDemoSession) StartPingPong() (*types.Transaction, error) { + return _PingPongDemo.Contract.StartPingPong(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) StartPingPong() (*types.Transaction, error) { + return _PingPongDemo.Contract.StartPingPong(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "transferOwnership", to) +} + +func (_PingPongDemo *PingPongDemoSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) +} + +func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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) 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 PingPongDemoApprovedSenderModifiedIterator struct { + Event *PingPongDemoApprovedSenderModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoApprovedSenderModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoApprovedSenderModified) + 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(PingPongDemoApprovedSenderModified) + 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 *PingPongDemoApprovedSenderModifiedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoApprovedSenderModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoApprovedSenderModified struct { + DestChainSelector uint64 + Recipient common.Hash + IsBeingApproved bool + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderModifiedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &PingPongDemoApprovedSenderModifiedIterator{contract: _PingPongDemo.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoApprovedSenderModified) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderModified", 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) ParseApprovedSenderModified(log types.Log) (*PingPongDemoApprovedSenderModified, error) { + event := new(PingPongDemoApprovedSenderModified) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoCCIPRouterModifiedIterator struct { + Event *PingPongDemoCCIPRouterModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoCCIPRouterModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoCCIPRouterModified) + 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(PingPongDemoCCIPRouterModified) + 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 *PingPongDemoCCIPRouterModifiedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoCCIPRouterModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*PingPongDemoCCIPRouterModifiedIterator, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return &PingPongDemoCCIPRouterModifiedIterator{contract: _PingPongDemo.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoCCIPRouterModified) + if err := _PingPongDemo.contract.UnpackLog(event, "CCIPRouterModified", 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) ParseCCIPRouterModified(log types.Log) (*PingPongDemoCCIPRouterModified, error) { + event := new(PingPongDemoCCIPRouterModified) + if err := _PingPongDemo.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoChainAddedIterator struct { + Event *PingPongDemoChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoChainAdded) + 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(PingPongDemoChainAdded) + 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 *PingPongDemoChainAddedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoChainAdded struct { + RemoteChainSelector uint64 + Recipient []byte + ExtraArgsBytes []byte + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterChainAdded(opts *bind.FilterOpts) (*PingPongDemoChainAddedIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &PingPongDemoChainAddedIterator{contract: _PingPongDemo.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoChainAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_PingPongDemo *PingPongDemoFilterer) ParseChainAdded(log types.Log) (*PingPongDemoChainAdded, error) { + event := new(PingPongDemoChainAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoChainRemovedIterator struct { + Event *PingPongDemoChainRemoved -func (_PingPongDemo *PingPongDemoTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "startPingPong") -} + contract *bind.BoundContract + event string -func (_PingPongDemo *PingPongDemoSession) StartPingPong() (*types.Transaction, error) { - return _PingPongDemo.Contract.StartPingPong(&_PingPongDemo.TransactOpts) + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -func (_PingPongDemo *PingPongDemoTransactorSession) StartPingPong() (*types.Transaction, error) { - return _PingPongDemo.Contract.StartPingPong(&_PingPongDemo.TransactOpts) -} +func (it *PingPongDemoChainRemovedIterator) Next() bool { -func (_PingPongDemo *PingPongDemoTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "transferOwnership", to) -} + if it.fail != nil { + return false + } -func (_PingPongDemo *PingPongDemoSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) -} + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true -func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) -} + default: + return false + } + } -func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "updateApprovedSenders", adds, removes) -} + select { + case log := <-it.logs: + it.Event = new(PingPongDemoChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true -func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) +func (it *PingPongDemoChainRemovedIterator) Error() error { + return it.fail } -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 (it *PingPongDemoChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil } -func (_PingPongDemo *PingPongDemoSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _PingPongDemo.Contract.WithdrawNativeToken(&_PingPongDemo.TransactOpts, to, amount) +type PingPongDemoChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log } -func (_PingPongDemo *PingPongDemoTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _PingPongDemo.Contract.WithdrawNativeToken(&_PingPongDemo.TransactOpts, to, amount) -} +func (_PingPongDemo *PingPongDemoFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*PingPongDemoChainRemovedIterator, error) { -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) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &PingPongDemoChainRemovedIterator{contract: _PingPongDemo.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -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 *PingPongDemoFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved) (event.Subscription, error) { -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) -} + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: -func (_PingPongDemo *PingPongDemoTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PingPongDemo.contract.RawTransact(opts, nil) -} + event := new(PingPongDemoChainRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log -func (_PingPongDemo *PingPongDemoSession) Receive() (*types.Transaction, error) { - return _PingPongDemo.Contract.Receive(&_PingPongDemo.TransactOpts) + 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 *PingPongDemoTransactorSession) Receive() (*types.Transaction, error) { - return _PingPongDemo.Contract.Receive(&_PingPongDemo.TransactOpts) +func (_PingPongDemo *PingPongDemoFilterer) ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, error) { + event := new(PingPongDemoChainRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil } type PingPongDemoFeeTokenModifiedIterator struct { @@ -2234,14 +2749,158 @@ func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDe return event, nil } +type PingPongDemoTokensWithdrawnByOwnerIterator struct { + Event *PingPongDemoTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoTokensWithdrawnByOwner) + 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(PingPongDemoTokensWithdrawnByOwner) + 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 *PingPongDemoTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*PingPongDemoTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &PingPongDemoTokensWithdrawnByOwnerIterator{contract: _PingPongDemo.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *PingPongDemoTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(PingPongDemoTokensWithdrawnByOwner) + if err := _PingPongDemo.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*PingPongDemoTokensWithdrawnByOwner, error) { + event := new(PingPongDemoTokensWithdrawnByOwner) + if err := _PingPongDemo.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type SChainConfigs struct { - Disabled bool Recipient []byte ExtraArgsBytes []byte } func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _PingPongDemo.abi.Events["ApprovedSenderModified"].ID: + return _PingPongDemo.ParseApprovedSenderModified(log) + case _PingPongDemo.abi.Events["CCIPRouterModified"].ID: + return _PingPongDemo.ParseCCIPRouterModified(log) + case _PingPongDemo.abi.Events["ChainAdded"].ID: + return _PingPongDemo.ParseChainAdded(log) + case _PingPongDemo.abi.Events["ChainRemoved"].ID: + return _PingPongDemo.ParseChainRemoved(log) case _PingPongDemo.abi.Events["FeeTokenModified"].ID: return _PingPongDemo.ParseFeeTokenModified(log) case _PingPongDemo.abi.Events["MessageAbandoned"].ID: @@ -2266,12 +2925,30 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, return _PingPongDemo.ParsePing(log) case _PingPongDemo.abi.Events["Pong"].ID: return _PingPongDemo.ParsePong(log) + case _PingPongDemo.abi.Events["TokensWithdrawnByOwner"].ID: + return _PingPongDemo.ParseTokensWithdrawnByOwner(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) } } +func (PingPongDemoApprovedSenderModified) Topic() common.Hash { + return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +} + +func (PingPongDemoCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (PingPongDemoChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (PingPongDemoChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + func (PingPongDemoFeeTokenModified) Topic() common.Hash { return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") } @@ -2320,12 +2997,16 @@ func (PingPongDemoPong) Topic() common.Hash { return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") } +func (PingPongDemoTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + func (_PingPongDemo *PingPongDemo) Address() common.Address { return _PingPongDemo.address } type PingPongDemoInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) @@ -2357,16 +3038,16 @@ type PingPongDemoInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*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) - - EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) - ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) @@ -2383,7 +3064,7 @@ type PingPongDemoInterface 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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2391,6 +3072,30 @@ type PingPongDemoInterface interface { Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderModifiedIterator, error) + + WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderModified(log types.Log) (*PingPongDemoApprovedSenderModified, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*PingPongDemoCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*PingPongDemoCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts) (*PingPongDemoChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*PingPongDemoChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*PingPongDemoChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, 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) @@ -2463,6 +3168,12 @@ type PingPongDemoInterface interface { ParsePong(log types.Log) (*PingPongDemoPong, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*PingPongDemoTokensWithdrawnByOwnerIterator, error) + + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *PingPongDemoTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokensWithdrawnByOwner(log types.Log) (*PingPongDemoTokensWithdrawnByOwner, error) + ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address 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 eb5448c4b5..8065ff8c18 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,11 +30,18 @@ var ( _ = abi.ConvertType ) -type CCIPClientBaseApprovedSenderUpdate struct { +type CCIPBaseApprovedSenderUpdate struct { DestChainSelector uint64 Sender []byte } +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -49,8 +56,8 @@ type ClientEVMTokenAmount struct { } var SelfFundedPingPongMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"roundTripsBeforeFunding\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"CannotAcknowledgeUnsentMessage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAlreadyAcknowledged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageNotFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Funded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenReceiver\",\"type\":\"address\"}],\"name\":\"MessageAbandoned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"MessageAckReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageAckSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incomingMessageId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"ACKMessageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"MessageSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"abandonFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"disableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"enableChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"disabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"s_messageStatus\",\"outputs\":[{\"internalType\":\"enumCCIPReceiverWithACK.MessageStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"setCountIncrBeforeFunding\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPClientBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawNativeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162004c4438038062004c44833981016040819052620000349162000591565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200016d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03908116608052600780546001600160a01b03191691841691821790551590506200013557620001356001600160a01b0382168360001962000218565b5050505050508060026200014a919062000600565b6009601d6101000a81548160ff021916908360ff16021790555050505062000700565b336001600160a01b03821603620001c75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000626565b6200029c919062000640565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002f891869190620002fe16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200034d906001600160a01b038516908490620003d4565b805190915015620003cf57808060200190518101906200036e91906200065c565b620003cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003e58484600085620003ed565b949350505050565b606082471015620004505760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200046e9190620006ad565b60006040518083038185875af1925050503d8060008114620004ad576040519150601f19603f3d011682016040523d82523d6000602084013e620004b2565b606091505b509092509050620004c687838387620004d1565b979650505050505050565b60608315620005455782516000036200053d576001600160a01b0385163b6200053d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003e5565b620003e583838151156200055c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006cb565b6001600160a01b03811681146200058e57600080fd5b50565b600080600060608486031215620005a757600080fd5b8351620005b48162000578565b6020850151909350620005c78162000578565b604085015190925060ff81168114620005df57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200061f576200061f620005ea565b5092915050565b6000602082840312156200063957600080fd5b5051919050565b80820180821115620006565762000656620005ea565b92915050565b6000602082840312156200066f57600080fd5b815180151581146200068057600080fd5b9392505050565b60005b83811015620006a45781810151838201526020016200068a565b50506000910152565b60008251620006c181846020870162000687565b9190910192915050565b6020815260008251806020840152620006ec81604085016020870162000687565b601f01601f19169190910160400192915050565b6080516144f062000754600039600081816105e601528181610827015281816108b701528181611441015281816117bf015281816122e6015281816123af015281816124870152612b7901526144f06000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e14610744578063f2fde38b14610764578063ff2deec31461078457600080fd5b8063e6c725f5146106eb578063e89b44851461073157600080fd5b8063bee518a414610662578063cf6730f81461068b578063d8469e40146106ab578063e4ca8754146106cb57600080fd5b80639d2aede5116100ec5780639d2aede5146105b7578063b0f479a1146105d7578063b187bd261461060a578063b5a110111461064257600080fd5b80638462a2b91461052c57806385572ffb1461054c5780638da5cb5b1461056c5780638f491cba1461059757600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ae5780636fef519e146104ce57806379ba50971461051757600080fd5b80635e35359e146104615780636939cd971461048157600080fd5b806335f170ef146103c457806341eade46146103f35780635075a9d414610413578063536c6bfa1461044157600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b5061025961024436600461336a565b60086020526000908152604090205460ff1681565b6040516102669190613383565b60405180910390f35b34801561027b57600080fd5b5061028f61028a366004613423565b6107b1565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba36600461349a565b6107fc565b005b3480156102cd57600080fd5b506102bf6102dc3660046134c5565b610974565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613550565b34801561034357600080fd5b506102bf610352366004613563565b6109ce565b34801561036357600080fd5b506102bf610a11565b34801561037857600080fd5b5060095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613563565b610a4d565b60405161026693929190613580565b3480156103ff57600080fd5b506102bf61040e366004613563565b610b84565b34801561041f57600080fd5b5061043361042e36600461336a565b610bcf565b604051908152602001610266565b34801561044d57600080fd5b506102bf61045c3660046135b7565b610be2565b34801561046d57600080fd5b506102bf61047c3660046135e3565b610bf8565b34801561048d57600080fd5b506104a161049c36600461336a565b610c26565b6040516102669190613681565b3480156104ba57600080fd5b506102bf6104c936600461371e565b610e31565b3480156104da57600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052357600080fd5b506102bf61114b565b34801561053857600080fd5b506102bf610547366004613793565b611248565b34801561055857600080fd5b506102bf6105673660046137ff565b611429565b34801561057857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a357600080fd5b506102bf6105b236600461336a565b611724565b3480156105c357600080fd5b506102bf6105d236600461349a565b611908565b3480156105e357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039f565b34801561061657600080fd5b506009547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064e57600080fd5b506102bf61065d36600461383a565b6119c2565b34801561066e57600080fd5b5060095460405167ffffffffffffffff9091168152602001610266565b34801561069757600080fd5b506102bf6106a63660046137ff565b611b35565b3480156106b757600080fd5b506102bf6106c6366004613868565b611d22565b3480156106d757600080fd5b506102bf6106e636600461336a565b611da1565b3480156106f757600080fd5b506009547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b61043361073f366004613a20565b61200b565b34801561075057600080fd5b506102bf61075f366004613b2d565b61258f565b34801561077057600080fd5b506102bf61077f36600461349a565b612620565b34801561079057600080fd5b5060075461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526002602052604080822090516003909101906107e09085908590613b50565b9081526040519081900360200190205460ff1690509392505050565b610804612631565b60075473ffffffffffffffffffffffffffffffffffffffff1615610867576108677f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff169060006126b2565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610916576109167f000000000000000000000000000000000000000000000000000000000000000060075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128b2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61097c612631565b600980549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109d6612631565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a19612631565b600980547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a4b60016129b6565b565b6002602052600090815260409020805460018201805460ff9092169291610a7390613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613b60565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505090806002018054610b0190613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90613b60565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905083565b610b8c612631565b67ffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610bdc600483612bfe565b92915050565b610bea612631565b610bf48282612c11565b5050565b610c00612631565b610c2173ffffffffffffffffffffffffffffffffffffffff84168383612d6b565b505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260038152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c9590613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613b60565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b50505050508152602001600382018054610d2790613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5390613b60565b8015610da05780601f10610d7557610100808354040283529160200191610da0565b820191906000526020600020905b815481529060010190602001808311610d8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dce565b505050915250909392505050565b610e39612631565b6001610e46600484612bfe565b14610e85576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e958260025b60049190612dc1565b506000828152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610edd90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613b60565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b50505050508152602001600382018054610f6f90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613b60565b8015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561106b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611016565b5050505081525050905060005b8160800151518110156110fa576110f2838360800151838151811061109f5761109f613bb3565b602002602001015160200151846080015184815181106110c1576110c1613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6b9092919063ffffffff16565b600101611078565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e7c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611250612631565b60005b81811015611333576002600084848481811061127157611271613bb3565b90506020028101906112839190613be2565b611291906020810190613563565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018383838181106112c8576112c8613bb3565b90506020028101906112da9190613be2565b6112e8906020810190613c20565b6040516112f6929190613b50565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101611253565b5060005b838110156114225760016002600087878581811061135757611357613bb3565b90506020028101906113699190613be2565b611377906020810190613563565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206003018686848181106113ae576113ae613bb3565b90506020028101906113c09190613be2565b6113ce906020810190613c20565b6040516113dc929190613b50565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055600101611337565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461149a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e7c565b6114aa6040820160208301613563565b6114b76040830183613c20565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260026020526040908190209051600390910193506115159250849150613c85565b9081526040519081900360200190205460ff1661156057806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b6115706040840160208501613563565b67ffffffffffffffff8116600090815260026020526040902060018101805461159890613b60565b159050806115a75750805460ff165b156115ea576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611626908890600401613d99565b600060405180830381600087803b15801561164057600080fd5b505af1925050508015611651575060015b6116f1573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5061169186356001610e8c565b508535600090815260036020526040902086906116ae828261416b565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116e3908490613550565b60405180910390a250611422565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6009547d010000000000000000000000000000000000000000000000000000000000900460ff16158061177c57506009547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156117845750565b6009546001906117b8907d010000000000000000000000000000000000000000000000000000000000900460ff1683614265565b11611905577f00000000000000000000000000000000000000000000000000000000000000006009546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c91906142a0565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118c357600080fd5b505af11580156118d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611910612631565b600980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815260095467ffffffffffffffff16600090815260026020522060010190610bf490826142bd565b6119ca612631565b6009805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600260209081526040918290208251918201939093526001926003019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a8591613c85565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260026020522060010190610c2190826142bd565b333014611b6e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e6040820160208301613563565b611b8b6040830183613c20565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526002602052604090819020905160039091019350611be99250849150613c85565b9081526040519081900360200190205460ff16611c3457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b611c446040840160208501613563565b67ffffffffffffffff81166000908152600260205260409020600181018054611c6c90613b60565b15905080611c7b5750805460ff165b15611cbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6000611ccd6060870187613c20565b810190611cda919061336a565b6009549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611d1a57611d1a611d158260016143d7565b6129b6565b505050505050565b611d2a612631565b67ffffffffffffffff8516600090815260026020526040902060018101611d52858783613eef565b508115611d6a5760028101611d68838583613eef565b505b805460ff1615611d1a5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050505050565b6001611dae600483612bfe565b14611de8576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e7c565b611df3816000610e8c565b506000818152600360209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e3b90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6790613b60565b8015611eb45780601f10611e8957610100808354040283529160200191611eb4565b820191906000526020600020905b815481529060010190602001808311611e9757829003601f168201915b50505050508152602001600382018054611ecd90613b60565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990613b60565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fc95760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f74565b50505050815250509050611fdc81612dd6565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526002602052604081206001810180548692919061203790613b60565b159050806120465750805460ff165b15612089576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e7c565b6040805160a08101825267ffffffffffffffff88166000908152600260205291822060010180548291906120bc90613b60565b80601f01602080910402602001604051908101604052809291908181526020018280546120e890613b60565b80156121355780601f1061210a57610100808354040283529160200191612135565b820191906000526020600020905b81548152906001019060200180831161211857829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526002928390522001805460809092019161219490613b60565b80601f01602080910402602001604051908101604052809291908181526020018280546121c090613b60565b801561220d5780601f106121e25761010080835404028352916020019161220d565b820191906000526020600020905b8154815290600101906020018083116121f057829003601f168201915b5050505050815250905060005b865181101561236e5761228a333089848151811061223a5761223a613bb3565b6020026020010151602001518a858151811061225857612258613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dde909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106122ba576122ba613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614612366576123667f000000000000000000000000000000000000000000000000000000000000000088838151811061231757612317613bb3565b60200260200101516020015189848151811061233557612335613bb3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128b29092919063ffffffff16565b60010161221a565b506040517f20487ded00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906123e6908b9086906004016143ea565b602060405180830381865afa158015612403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242791906144ad565b60075490915073ffffffffffffffffffffffffffffffffffffffff161561246d5760075461246d9073ffffffffffffffffffffffffffffffffffffffff16333084612dde565b60075473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916396f4e9f99116156124bc5760006124be565b825b8a856040518463ffffffff1660e01b81526004016124dd9291906143ea565b60206040518083038185885af11580156124fb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061252091906144ad565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612597612631565b600980547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612628612631565b61190581612e3c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e7c565b80158061275257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275091906144ad565b155b6127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f31565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d91906144ad565b61295791906143d7565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129b09085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612830565b50505050565b806001166001036129f9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a2d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a3681611724565b6040805160a0810190915260095468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a9a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612b1457816020015b6040805180820190915260008082526020820152815260200190600190039081612aed5790505b50815260075473ffffffffffffffffffffffffffffffffffffffff908116602080840191909152604080519182018152600082529283015260095491517f96f4e9f90000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000000000000000000000000000000000000000000016916396f4e9f991612bbb9167ffffffffffffffff9091169085906004016143ea565b6020604051808303816000875af1158015612bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2191906144ad565b6000612c0a838361303d565b9392505050565b80471015612c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e7c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd5576040519150601f19603f3d011682016040523d82523d6000602084013e612cda565b606091505b5050905080610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e7c565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c219084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612830565b6000612dce8484846130c7565b949350505050565b611905612631565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129b09085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612830565b3373ffffffffffffffffffffffffffffffffffffffff821603612ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e7c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612f93826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130e49092919063ffffffff16565b805190915015610c215780806020019051810190612fb191906144c6565b610c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e7c565b600081815260028301602052604081205480151580613061575061306184846130f3565b612c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e7c565b60008281526002840160205260408120829055612dce84846130ff565b6060612dce848460008561310b565b6000612c0a8383613224565b6000612c0a838361323c565b60608247101561319d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e7c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131c69190613c85565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50915091506132198783838761328b565b979650505050505050565b60008181526001830160205260408120541515612c0a565b600081815260018301602052604081205461328357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b6060831561332157825160000361331a5773ffffffffffffffffffffffffffffffffffffffff85163b61331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e7c565b5081612dce565b612dce83838151156133365781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c9190613550565b60006020828403121561337c57600080fd5b5035919050565b60208101600383106133be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461190557600080fd5b60008083601f8401126133ec57600080fd5b50813567ffffffffffffffff81111561340457600080fd5b60208301915083602082850101111561341c57600080fd5b9250929050565b60008060006040848603121561343857600080fd5b8335613443816133c4565b9250602084013567ffffffffffffffff81111561345f57600080fd5b61346b868287016133da565b9497909650939450505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461190557600080fd5b6000602082840312156134ac57600080fd5b8135612c0a81613478565b801515811461190557600080fd5b6000602082840312156134d757600080fd5b8135612c0a816134b7565b60005b838110156134fd5781810151838201526020016134e5565b50506000910152565b6000815180845261351e8160208601602086016134e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0a6020830184613506565b60006020828403121561357557600080fd5b8135612c0a816133c4565b831515815260606020820152600061359b6060830185613506565b82810360408401526135ad8185613506565b9695505050505050565b600080604083850312156135ca57600080fd5b82356135d581613478565b946020939093013593505050565b6000806000606084860312156135f857600080fd5b833561360381613478565b9250602084013561361381613478565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613676578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613639565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136bb60c0840182613506565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136f78383613506565b925060808601519150808584030160a0860152506137158282613624565b95945050505050565b6000806040838503121561373157600080fd5b82359150602083013561374381613478565b809150509250929050565b60008083601f84011261376057600080fd5b50813567ffffffffffffffff81111561377857600080fd5b6020830191508360208260051b850101111561341c57600080fd5b600080600080604085870312156137a957600080fd5b843567ffffffffffffffff808211156137c157600080fd5b6137cd8883890161374e565b909650945060208701359150808211156137e657600080fd5b506137f38782880161374e565b95989497509550505050565b60006020828403121561381157600080fd5b813567ffffffffffffffff81111561382857600080fd5b820160a08185031215612c0a57600080fd5b6000806040838503121561384d57600080fd5b8235613858816133c4565b9150602083013561374381613478565b60008060008060006060868803121561388057600080fd5b853561388b816133c4565b9450602086013567ffffffffffffffff808211156138a857600080fd5b6138b489838a016133da565b909650945060408801359150808211156138cd57600080fd5b506138da888289016133da565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561393d5761393d6138eb565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561398a5761398a6138eb565b604052919050565b600082601f8301126139a357600080fd5b813567ffffffffffffffff8111156139bd576139bd6138eb565b6139ee60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613943565b818152846020838601011115613a0357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a3557600080fd5b8335613a40816133c4565b925060208481013567ffffffffffffffff80821115613a5e57600080fd5b818701915087601f830112613a7257600080fd5b813581811115613a8457613a846138eb565b613a92848260051b01613943565b81815260069190911b8301840190848101908a831115613ab157600080fd5b938501935b82851015613afd576040858c031215613acf5760008081fd5b613ad761391a565b8535613ae281613478565b81528587013587820152825260409094019390850190613ab6565b965050506040870135925080831115613b1557600080fd5b5050613b2386828701613992565b9150509250925092565b600060208284031215613b3f57600080fd5b813560ff81168114612c0a57600080fd5b8183823760009101908152919050565b600181811c90821680613b7457607f821691505b602082108103613bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c1657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5557600080fd5b83018035915067ffffffffffffffff821115613c7057600080fd5b60200191503681900382131561341c57600080fd5b60008251613c168184602087016134e2565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ccc57600080fd5b830160208101925035905067ffffffffffffffff811115613cec57600080fd5b80360382131561341c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613676578135613d6781613478565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d54565b602081528135602082015260006020830135613db4816133c4565b67ffffffffffffffff8082166040850152613dd26040860186613c97565b925060a06060860152613de960c086018483613cfb565b925050613df96060860186613c97565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e2f858385613cfb565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e6857600080fd5b60209288019283019235915083821115613e8157600080fd5b8160061b3603831315613e9357600080fd5b8685030160a0870152613219848284613d44565b601f821115610c21576000816000526020600020601f850160051c81016020861015613ed05750805b601f850160051c820191505b81811015611d1a57828155600101613edc565b67ffffffffffffffff831115613f0757613f076138eb565b613f1b83613f158354613b60565b83613ea7565b6000601f841160018114613f6d5760008515613f375750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611422565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fbc5786850135825560209485019460019092019101613f9c565b5086821015613ff7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561404381613478565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140a9576140a96138eb565b8054838255808410156141365760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140ea576140ea614009565b80861686146140fb576140fb614009565b5060008360005260206000208360011b81018760011b820191505b80821015614131578282558284830155600282019150614116565b505050505b5060008181526020812083915b85811015611d1a576141558383614038565b6040929092019160029190910190600101614143565b81358155600181016020830135614181816133c4565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141c16040860186613c20565b935091506141d3838360028701613eef565b6141e06060860186613c20565b935091506141f2838360038701613eef565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261422957600080fd5b91840191823591508082111561423e57600080fd5b506020820191508060061b360382131561425757600080fd5b6129b0818360048601614090565b60008261429b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142b257600080fd5b8151612c0a81613478565b815167ffffffffffffffff8111156142d7576142d76138eb565b6142eb816142e58454613b60565b84613ea7565b602080601f83116001811461433e57600084156143085750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611d1a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561438b5788860151825594840194600190910190840161436c565b50858210156143c757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610bdc57610bdc614009565b67ffffffffffffffff83168152604060208201526000825160a0604084015261441660e0840182613506565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144528383613506565b9250604086015191508085840301608086015261446f8383613624565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506135ad8282613506565b6000602082840312156144bf57600080fd5b5051919050565b6000602082840312156144d857600080fd5b8151612c0a816134b756fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b50604051620052153803806200521583398101604081905262000034916200059f565b828281818181818181803380600081620000955760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c857620000c8816200017b565b5050506001600160a01b038116620000f3576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200014157620001416001600160a01b0382168360001962000226565b50505050505050508060026200015891906200060e565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070e565b336001600160a01b03821603620001d55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008c565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e919062000634565b620002aa91906200064e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000306918691906200030c16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200035b906001600160a01b038516908490620003e2565b805190915015620003dd57808060200190518101906200037c91906200066a565b620003dd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008c565b505050565b6060620003f38484600085620003fb565b949350505050565b6060824710156200045e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008c565b600080866001600160a01b031685876040516200047c9190620006bb565b60006040518083038185875af1925050503d8060008114620004bb576040519150601f19603f3d011682016040523d82523d6000602084013e620004c0565b606091505b509092509050620004d487838387620004df565b979650505050505050565b60608315620005535782516000036200054b576001600160a01b0385163b6200054b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008c565b5081620003f3565b620003f383838151156200056a5781518083602001fd5b8060405162461bcd60e51b81526004016200008c9190620006d9565b6001600160a01b03811681146200059c57600080fd5b50565b600080600060608486031215620005b557600080fd5b8351620005c28162000586565b6020850151909350620005d58162000586565b604085015190925060ff81168114620005ed57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200062d576200062d620005f8565b5092915050565b6000602082840312156200064757600080fd5b5051919050565b80820180821115620006645762000664620005f8565b92915050565b6000602082840312156200067d57600080fd5b815180151581146200068e57600080fd5b9392505050565b60005b83811015620006b257818101518382015260200162000698565b50506000910152565b60008251620006cf81846020870162000695565b9190910192915050565b6020815260008251806020840152620006fa81604085016020870162000695565b601f01601f19169190910160400192915050565b614af7806200071e6000396000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063b5a11011116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063b5a1101114610659578063bee518a414610679578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b80639d2aede5116100ec5780639d2aede5146105b65780639fe74e26146105d6578063b0f479a1146105f6578063b187bd261461062157600080fd5b80638462a2b91461052b57806385572ffb1461054b5780638da5cb5b1461056b5780638f491cba1461059657600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ad5780636fef519e146104cd57806379ba50971461051657600080fd5b80635e35359e146104605780636939cd971461048057600080fd5b806335f170ef146103c45780634e12498b146103f25780635075a9d414610412578063536c6bfa1461044057600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613955565b60096020526000908152604090205460ff1681565b604051610266919061396e565b60405180910390f35b34801561027b57600080fd5b5061028f61028a3660046139c5565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613a6c565b6107f3565b005b3480156102cd57600080fd5b506102bf6102dc366004613a97565b610967565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613b22565b34801561034357600080fd5b506102bf610352366004613b35565b6109c1565b34801561036357600080fd5b506102bf610a04565b34801561037857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613b35565b610a40565b604051610266929190613b52565b3480156103fe57600080fd5b506102bf61040d366004613a6c565b610b6c565b34801561041e57600080fd5b5061043261042d366004613955565b610c38565b604051908152602001610266565b34801561044c57600080fd5b506102bf61045b366004613b80565b610c4b565b34801561046c57600080fd5b506102bf61047b366004613bac565b610caf565b34801561048c57600080fd5b506104a061049b366004613955565b610d44565b6040516102669190613c4a565b3480156104b957600080fd5b506102bf6104c8366004613cde565b610f4f565b3480156104d957600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052257600080fd5b506102bf611269565b34801561053757600080fd5b506102bf610546366004613d5a565b611366565b34801561055757600080fd5b506102bf610566366004613dc6565b6116c7565b34801561057757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a257600080fd5b506102bf6105b1366004613955565b6119d4565b3480156105c257600080fd5b506102bf6105d1366004613a6c565b611bb0565b3480156105e257600080fd5b506102bf6105f1366004613e01565b611c6b565b34801561060257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561062d57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561066557600080fd5b506102bf610674366004613e43565b611feb565b34801561068557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b3480156106ae57600080fd5b506102bf6106bd366004613dc6565b61215b565b3480156106ce57600080fd5b506102bf6106dd366004613955565b612378565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b610432610736366004613fa6565b6125e2565b34801561074757600080fd5b506102bf6107563660046140b3565b612b18565b34801561076757600080fd5b506102bf610776366004613a6c565b612ba9565b34801561078757600080fd5b5060085461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d790859085906140d6565b9081526040519081900360200190205460ff1690509392505050565b6107fb612bba565b60085473ffffffffffffffffffffffffffffffffffffffff161561085c5761085c61083b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612c3b565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610909576109096108c960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612e3b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61096f612bba565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109c9612bba565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a0c612bba565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a3e6001612f3f565b565b600360205260009081526040902080548190610a5b906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a87906140e6565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b505050505090806001018054610ae9906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b15906140e6565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905082565b610b74612bba565b73ffffffffffffffffffffffffffffffffffffffff8116610bc1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610c4560058361319b565b92915050565b610c53612bba565b610c5d82826131ae565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610cb7612bba565b610cd873ffffffffffffffffffffffffffffffffffffffff84168383613308565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610d3791815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610db3906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddf906140e6565b8015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b50505050508152602001600382018054610e45906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e71906140e6565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f415760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610eec565b505050915250909392505050565b610f57612bba565b6001610f6460058461319b565b14610fa3576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610fb38260025b6005919061335e565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610ffb906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611027906140e6565b80156110745780601f1061104957610100808354040283529160200191611074565b820191906000526020600020905b81548152906001019060200180831161105757829003601f168201915b5050505050815260200160038201805461108d906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546110b9906140e6565b80156111065780601f106110db57610100808354040283529160200191611106565b820191906000526020600020905b8154815290600101906020018083116110e957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156111895760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611134565b5050505081525050905060005b8160800151518110156112185761121083836080015183815181106111bd576111bd614139565b602002602001015160200151846080015184815181106111df576111df614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166133089092919063ffffffff16565b600101611196565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610f9a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61136e612bba565b60005b81811015611511576003600084848481811061138f5761138f614139565b90506020028101906113a19190614168565b6113af906020810190613b35565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106113e6576113e6614139565b90506020028101906113f89190614168565b6114069060208101906141a6565b6040516114149291906140d6565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061145b5761145b614139565b905060200281019061146d9190614168565b61147b9060208101906141a6565b6040516114899291906140d6565b60405180910390208383838181106114a3576114a3614139565b90506020028101906114b59190614168565b6114c3906020810190613b35565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611501911515815260200190565b60405180910390a3600101611371565b5060005b838110156116c05760016003600087878581811061153557611535614139565b90506020028101906115479190614168565b611555906020810190613b35565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061158c5761158c614139565b905060200281019061159e9190614168565b6115ac9060208101906141a6565b6040516115ba9291906140d6565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061160a5761160a614139565b905060200281019061161c9190614168565b61162a9060208101906141a6565b6040516116389291906140d6565b604051809103902085858381811061165257611652614139565b90506020028101906116649190614168565b611672906020810190613b35565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516116b0911515815260200190565b60405180910390a3600101611515565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461171a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610f9a565b61172a6040820160208301613b35565b61173760408301836141a6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061178e925090506140e6565b159050806117e45750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117cf919061420b565b9081526040519081900360200190205460ff16155b1561181d57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b22565b61182d6040840160208501613b35565b67ffffffffffffffff8116600090815260036020526040902080548190611853906140e6565b905060000361189a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906118d690889060040161431f565b600060405180830381600087803b1580156118f057600080fd5b505af1925050508015611901575060015b6119a1573d80801561192f576040519150601f19603f3d011682016040523d82523d6000602084013e611934565b606091505b5061194186356001610faa565b5085356000908152600460205260409020869061195e82826146f1565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611993908490613b22565b60405180910390a2506116c0565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff161580611a2c5750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b15611a345750565b600a54600190611a68907d010000000000000000000000000000000000000000000000000000000000900460ff16836147eb565b11611bad5760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b249190614826565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611bb8612bba565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff16600090815260036020522090611c679082614843565b5050565b611c73612bba565b60005b81811015611fe657828282818110611c9057611c90614139565b9050602002810190611ca2919061495d565b611cb3906040810190602001613a97565b611d865760036000848484818110611ccd57611ccd614139565b9050602002810190611cdf919061495d565b611ced906020810190613b35565b67ffffffffffffffff16815260208101919091526040016000908120611d1291613907565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916838383818110611d4557611d45614139565b9050602002810190611d57919061495d565b611d65906020810190613b35565b60405167ffffffffffffffff909116815260200160405180910390a1611fde565b828282818110611d9857611d98614139565b9050602002810190611daa919061495d565b611db89060408101906141a6565b9050600003611df3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611e0b57611e0b614139565b9050602002810190611e1d919061495d565b611e2b906020810190613b35565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611e6157611e61614139565b9050602002810190611e73919061495d565b611e819060408101906141a6565b8291611e8e919083614475565b50838383818110611ea157611ea1614139565b9050602002810190611eb3919061495d565b611ec19060608101906141a6565b159050611f0c57838383818110611eda57611eda614139565b9050602002810190611eec919061495d565b611efa9060608101906141a6565b6001830191611f0a919083614475565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212848484818110611f3f57611f3f614139565b9050602002810190611f51919061495d565b611f5f906020810190613b35565b858585818110611f7157611f71614139565b9050602002810190611f83919061495d565b611f919060408101906141a6565b878787818110611fa357611fa3614139565b9050602002810190611fb5919061495d565b611fc39060608101906141a6565b604051611fd4959493929190614991565b60405180910390a1505b600101611c76565b505050565b611ff3612bba565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526120ae9161420b565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611fe69082614843565b333014612194576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a46040820160208301613b35565b6121b160408301836141a6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350612208925090506140e6565b1590508061225e5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051612249919061420b565b9081526040519081900360200190205460ff16155b1561229757806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b22565b6122a76040840160208501613b35565b67ffffffffffffffff81166000908152600360205260409020805481906122cd906140e6565b9050600003612314576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b600061232360608701876141a6565b8101906123309190613955565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff166123705761237061236b8260016149d4565b612f3f565b505050505050565b600161238560058361319b565b146123bf576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610f9a565b6123ca816000610faa565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191612412906140e6565b80601f016020809104026020016040519081016040528092919081815260200182805461243e906140e6565b801561248b5780601f106124605761010080835404028352916020019161248b565b820191906000526020600020905b81548152906001019060200180831161246e57829003601f168201915b505050505081526020016003820180546124a4906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546124d0906140e6565b801561251d5780601f106124f25761010080835404028352916020019161251d565b820191906000526020600020905b81548152906001019060200180831161250057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156125a05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161254b565b505050508152505090506125b381613373565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061260b906140e6565b9050600003612652576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190612682906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546126ae906140e6565b80156126fb5780601f106126d0576101008083540402835291602001916126fb565b820191906000526020600020905b8154815290600101906020018083116126de57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161275c906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054612788906140e6565b80156127d55780601f106127aa576101008083540402835291602001916127d5565b820191906000526020600020905b8154815290600101906020018083116127b857829003601f168201915b5050505050815250905060005b865181101561293257612852333089848151811061280257612802614139565b6020026020010151602001518a858151811061282057612820614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661337b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061288257612882614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461292a57600254875161292a9173ffffffffffffffffffffffffffffffffffffffff16908990849081106128db576128db614139565b6020026020010151602001518984815181106128f9576128f9614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c3b9092919063ffffffff16565b6001016127e2565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded9061298c908b9086906004016149e7565b602060405180830381865afa1580156129a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cd9190614ab4565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612a1357600854612a139073ffffffffffffffffffffffffffffffffffffffff1633308461337b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612a45576000612a47565b825b8a856040518463ffffffff1660e01b8152600401612a669291906149e7565b60206040518083038185885af1158015612a84573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612aa99190614ab4565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612b20612bba565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612bb1612bba565b611bad816133d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f9a565b801580612cdb57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd99190614ab4565b155b612d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611fe69084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526134ce565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed69190614ab4565b612ee091906149d4565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612f399085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612db9565b50505050565b80600116600103612f82576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612fb6565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612fbf816119d4565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161302391815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561309d57816020015b60408051808201909152600080825260208201528152602001906001900390816130765790505b50815260085473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604080519182018152600082529091015290506130f460025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f9916131589167ffffffffffffffff9091169085906004016149e7565b6020604051808303816000875af1158015613177573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe69190614ab4565b60006131a783836135da565b9392505050565b80471015613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f9a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613272576040519150601f19603f3d011682016040523d82523d6000602084013e613277565b606091505b5050905080611fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611fe69084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612db9565b600061336b848484613664565b949350505050565b611bad612bba565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f399085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612db9565b3373ffffffffffffffffffffffffffffffffffffffff821603613458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f9a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613530826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136819092919063ffffffff16565b805190915015611fe6578080602001905181019061354e9190614acd565b611fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9a565b6000818152600283016020526040812054801515806135fe57506135fe8484613690565b6131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610f9a565b6000828152600284016020526040812082905561336b848461369c565b606061336b84846000856136a8565b60006131a783836137c1565b60006131a783836137d9565b60608247101561373a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613763919061420b565b60006040518083038185875af1925050503d80600081146137a0576040519150601f19603f3d011682016040523d82523d6000602084013e6137a5565b606091505b50915091506137b687838387613828565b979650505050505050565b600081815260018301602052604081205415156131a7565b600081815260018301602052604081205461382057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c45565b506000610c45565b606083156138be5782516000036138b75773ffffffffffffffffffffffffffffffffffffffff85163b6138b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9a565b508161336b565b61336b83838151156138d35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b22565b508054613913906140e6565b6000825580601f10613923575050565b601f016020900490600052602060002090810190611bad91905b80821115613951576000815560010161393d565b5090565b60006020828403121561396757600080fd5b5035919050565b60208101600383106139a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611bad57600080fd5b6000806000604084860312156139da57600080fd5b83356139e5816139af565b9250602084013567ffffffffffffffff80821115613a0257600080fd5b818601915086601f830112613a1657600080fd5b813581811115613a2557600080fd5b876020828501011115613a3757600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff81168114611bad57600080fd5b600060208284031215613a7e57600080fd5b81356131a781613a4a565b8015158114611bad57600080fd5b600060208284031215613aa957600080fd5b81356131a781613a89565b60005b83811015613acf578181015183820152602001613ab7565b50506000910152565b60008151808452613af0816020860160208601613ab4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a76020830184613ad8565b600060208284031215613b4757600080fd5b81356131a7816139af565b604081526000613b656040830185613ad8565b8281036020840152613b778185613ad8565b95945050505050565b60008060408385031215613b9357600080fd5b8235613b9e81613a4a565b946020939093013593505050565b600080600060608486031215613bc157600080fd5b8335613bcc81613a4a565b92506020840135613bdc81613a4a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613c3f578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613c02565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613c8460c0840182613ad8565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613cc08383613ad8565b925060808601519150808584030160a086015250613b778282613bed565b60008060408385031215613cf157600080fd5b823591506020830135613d0381613a4a565b809150509250929050565b60008083601f840112613d2057600080fd5b50813567ffffffffffffffff811115613d3857600080fd5b6020830191508360208260051b8501011115613d5357600080fd5b9250929050565b60008060008060408587031215613d7057600080fd5b843567ffffffffffffffff80821115613d8857600080fd5b613d9488838901613d0e565b90965094506020870135915080821115613dad57600080fd5b50613dba87828801613d0e565b95989497509550505050565b600060208284031215613dd857600080fd5b813567ffffffffffffffff811115613def57600080fd5b820160a081850312156131a757600080fd5b60008060208385031215613e1457600080fd5b823567ffffffffffffffff811115613e2b57600080fd5b613e3785828601613d0e565b90969095509350505050565b60008060408385031215613e5657600080fd5b8235613e61816139af565b91506020830135613d0381613a4a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613ec357613ec3613e71565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613f1057613f10613e71565b604052919050565b600082601f830112613f2957600080fd5b813567ffffffffffffffff811115613f4357613f43613e71565b613f7460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613ec9565b818152846020838601011115613f8957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613fbb57600080fd5b8335613fc6816139af565b925060208481013567ffffffffffffffff80821115613fe457600080fd5b818701915087601f830112613ff857600080fd5b81358181111561400a5761400a613e71565b614018848260051b01613ec9565b81815260069190911b8301840190848101908a83111561403757600080fd5b938501935b82851015614083576040858c0312156140555760008081fd5b61405d613ea0565b853561406881613a4a565b8152858701358782015282526040909401939085019061403c565b96505050604087013592508083111561409b57600080fd5b50506140a986828701613f18565b9150509250925092565b6000602082840312156140c557600080fd5b813560ff811681146131a757600080fd5b8183823760009101908152919050565b600181811c908216806140fa57607f821691505b602082108103614133577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261419c57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126141db57600080fd5b83018035915067ffffffffffffffff8211156141f657600080fd5b602001915036819003821315613d5357600080fd5b6000825161419c818460208701613ab4565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261425257600080fd5b830160208101925035905067ffffffffffffffff81111561427257600080fd5b803603821315613d5357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613c3f5781356142ed81613a4a565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016142da565b60208152813560208201526000602083013561433a816139af565b67ffffffffffffffff8082166040850152614358604086018661421d565b925060a0606086015261436f60c086018483614281565b92505061437f606086018661421d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526143b5858385614281565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126143ee57600080fd5b6020928801928301923591508382111561440757600080fd5b8160061b360383131561441957600080fd5b8685030160a08701526137b68482846142ca565b601f821115611fe6576000816000526020600020601f850160051c810160208610156144565750805b601f850160051c820191505b8181101561237057828155600101614462565b67ffffffffffffffff83111561448d5761448d613e71565b6144a18361449b83546140e6565b8361442d565b6000601f8411600181146144f357600085156144bd5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556116c0565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156145425786850135825560209485019460019092019101614522565b508682101561457d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356145c981613a4a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561462f5761462f613e71565b8054838255808410156146bc5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146146705761467061458f565b80861686146146815761468161458f565b5060008360005260206000208360011b81018760011b820191505b808210156146b757828255828483015560028201915061469c565b505050505b5060008181526020812083915b85811015612370576146db83836145be565b60409290920191600291909101906001016146c9565b81358155600181016020830135614707816139af565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561474760408601866141a6565b93509150614759838360028701614475565b61476660608601866141a6565b93509150614778838360038701614475565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126147af57600080fd5b9184019182359150808211156147c457600080fd5b506020820191508060061b36038213156147dd57600080fd5b612f39818360048601614616565b600082614821577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561483857600080fd5b81516131a781613a4a565b815167ffffffffffffffff81111561485d5761485d613e71565b6148718161486b84546140e6565b8461442d565b602080601f8311600181146148c4576000841561488e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612370565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614911578886015182559484019460019091019084016148f2565b508582101561494d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261419c57600080fd5b67ffffffffffffffff861681526060602082015260006149b5606083018688614281565b82810360408401526149c8818587614281565b98975050505050505050565b80820180821115610c4557610c4561458f565b67ffffffffffffffff83168152604060208201526000825160a06040840152614a1360e0840182613ad8565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614a4f8383613ad8565b92506040860151915080858403016080860152614a6c8383613bed565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250614aaa8282613ad8565b9695505050505050565b600060208284031215614ac657600080fd5b5051919050565b600060208284031215614adf57600080fd5b81516131a781613a8956fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -189,25 +196,25 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorRaw) Transact(opts *bind. return _SelfFundedPingPong.Contract.contract.Transact(opts, method, params...) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { - return *new([]byte), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -func (_SelfFundedPingPong *SelfFundedPingPongSession) ACKMESSAGEHEADER() ([]byte, error) { +func (_SelfFundedPingPong *SelfFundedPingPongSession) ACKMESSAGEHEADER() (string, error) { return _SelfFundedPingPong.Contract.ACKMESSAGEHEADER(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) ACKMESSAGEHEADER() ([]byte, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) ACKMESSAGEHEADER() (string, error) { return _SelfFundedPingPong.Contract.ACKMESSAGEHEADER(&_SelfFundedPingPong.CallOpts) } @@ -420,9 +427,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongCaller) SChainConfigs(opts *bind.Ca return *outstruct, err } - 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) + outstruct.Recipient = *abi.ConvertType(out[0], new([]byte)).(*[]byte) + outstruct.ExtraArgsBytes = *abi.ConvertType(out[1], new([]byte)).(*[]byte) return *outstruct, err @@ -530,6 +536,18 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) AcceptOwnership( return _SelfFundedPingPong.Contract.AcceptOwnership(&_SelfFundedPingPong.TransactOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "applyChainUpdates", chains) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ApplyChainUpdates(&_SelfFundedPingPong.TransactOpts, chains) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ApplyChainUpdates(&_SelfFundedPingPong.TransactOpts, chains) +} + func (_SelfFundedPingPong *SelfFundedPingPongTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "ccipReceive", message) } @@ -554,30 +572,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) CcipSend(destCha return _SelfFundedPingPong.Contract.CcipSend(&_SelfFundedPingPong.TransactOpts, destChainSelector, tokenAmounts, data) } -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) } @@ -602,6 +596,18 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ModifyFeeToken(t return _SelfFundedPingPong.Contract.ModifyFeeToken(&_SelfFundedPingPong.TransactOpts, token) } +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "modifyRouter", newRouter) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ModifyRouter(&_SelfFundedPingPong.TransactOpts, newRouter) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.ModifyRouter(&_SelfFundedPingPong.TransactOpts, newRouter) +} + func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "processMessage", message) } @@ -682,80 +688,589 @@ func (_SelfFundedPingPong *SelfFundedPingPongSession) SetPaused(pause bool) (*ty 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 *SelfFundedPingPongTransactorSession) SetPaused(pause bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.SetPaused(&_SelfFundedPingPong.TransactOpts, pause) +} + +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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*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) 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 SelfFundedPingPongApprovedSenderModifiedIterator struct { + Event *SelfFundedPingPongApprovedSenderModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongApprovedSenderModified) + 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(SelfFundedPingPongApprovedSenderModified) + 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 *SelfFundedPingPongApprovedSenderModifiedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongApprovedSenderModified struct { + DestChainSelector uint64 + Recipient common.Hash + IsBeingApproved bool + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderModifiedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongApprovedSenderModifiedIterator{contract: _SelfFundedPingPong.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongApprovedSenderModified) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderModified", 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) ParseApprovedSenderModified(log types.Log) (*SelfFundedPingPongApprovedSenderModified, error) { + event := new(SelfFundedPingPongApprovedSenderModified) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongCCIPRouterModifiedIterator struct { + Event *SelfFundedPingPongCCIPRouterModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongCCIPRouterModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongCCIPRouterModified) + 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(SelfFundedPingPongCCIPRouterModified) + 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 *SelfFundedPingPongCCIPRouterModifiedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongCCIPRouterModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*SelfFundedPingPongCCIPRouterModifiedIterator, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongCCIPRouterModifiedIterator{contract: _SelfFundedPingPong.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongCCIPRouterModified) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "CCIPRouterModified", 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) ParseCCIPRouterModified(log types.Log) (*SelfFundedPingPongCCIPRouterModified, error) { + event := new(SelfFundedPingPongCCIPRouterModified) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongChainAddedIterator struct { + Event *SelfFundedPingPongChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongChainAdded) + 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(SelfFundedPingPongChainAdded) + 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 *SelfFundedPingPongChainAddedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongChainAdded struct { + RemoteChainSelector uint64 + Recipient []byte + ExtraArgsBytes []byte + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterChainAdded(opts *bind.FilterOpts) (*SelfFundedPingPongChainAddedIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &SelfFundedPingPongChainAddedIterator{contract: _SelfFundedPingPong.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainAdded) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongChainAdded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseChainAdded(log types.Log) (*SelfFundedPingPongChainAdded, error) { + event := new(SelfFundedPingPongChainAdded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongChainRemovedIterator struct { + Event *SelfFundedPingPongChainRemoved -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "startPingPong") -} + contract *bind.BoundContract + event string -func (_SelfFundedPingPong *SelfFundedPingPongSession) StartPingPong() (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.StartPingPong(&_SelfFundedPingPong.TransactOpts) + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) StartPingPong() (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.StartPingPong(&_SelfFundedPingPong.TransactOpts) -} +func (it *SelfFundedPingPongChainRemovedIterator) Next() bool { -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "transferOwnership", to) -} + if it.fail != nil { + return false + } -func (_SelfFundedPingPong *SelfFundedPingPongSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) -} + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongChainRemoved) + 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 *SelfFundedPingPongTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.TransferOwnership(&_SelfFundedPingPong.TransactOpts, to) -} + default: + return false + } + } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "updateApprovedSenders", adds, removes) -} + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongChainRemoved) + 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) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSenders(adds []CCIPClientBaseApprovedSenderUpdate, removes []CCIPClientBaseApprovedSenderUpdate) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) +func (it *SelfFundedPingPongChainRemovedIterator) Error() error { + return it.fail } -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 (it *SelfFundedPingPongChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil } -func (_SelfFundedPingPong *SelfFundedPingPongSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.WithdrawNativeToken(&_SelfFundedPingPong.TransactOpts, to, amount) +type SelfFundedPingPongChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.WithdrawNativeToken(&_SelfFundedPingPong.TransactOpts, to, amount) -} +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*SelfFundedPingPongChainRemovedIterator, error) { -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) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &SelfFundedPingPongChainRemovedIterator{contract: _SelfFundedPingPong.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -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 *SelfFundedPingPongFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainRemoved) (event.Subscription, error) { -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) -} + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.RawTransact(opts, nil) -} + event := new(SelfFundedPingPongChainRemoved) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log -func (_SelfFundedPingPong *SelfFundedPingPongSession) Receive() (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.Receive(&_SelfFundedPingPong.TransactOpts) + 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) Receive() (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.Receive(&_SelfFundedPingPong.TransactOpts) +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseChainRemoved(log types.Log) (*SelfFundedPingPongChainRemoved, error) { + event := new(SelfFundedPingPongChainRemoved) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil } type SelfFundedPingPongCountIncrBeforeFundingSetIterator struct { @@ -2513,14 +3028,158 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) return event, nil } +type SelfFundedPingPongTokensWithdrawnByOwnerIterator struct { + Event *SelfFundedPingPongTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongTokensWithdrawnByOwner) + 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(SelfFundedPingPongTokensWithdrawnByOwner) + 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 *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*SelfFundedPingPongTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongTokensWithdrawnByOwnerIterator{contract: _SelfFundedPingPong.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(SelfFundedPingPongTokensWithdrawnByOwner) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*SelfFundedPingPongTokensWithdrawnByOwner, error) { + event := new(SelfFundedPingPongTokensWithdrawnByOwner) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type SChainConfigs struct { - Disabled bool Recipient []byte ExtraArgsBytes []byte } func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { + case _SelfFundedPingPong.abi.Events["ApprovedSenderModified"].ID: + return _SelfFundedPingPong.ParseApprovedSenderModified(log) + case _SelfFundedPingPong.abi.Events["CCIPRouterModified"].ID: + return _SelfFundedPingPong.ParseCCIPRouterModified(log) + case _SelfFundedPingPong.abi.Events["ChainAdded"].ID: + return _SelfFundedPingPong.ParseChainAdded(log) + case _SelfFundedPingPong.abi.Events["ChainRemoved"].ID: + return _SelfFundedPingPong.ParseChainRemoved(log) case _SelfFundedPingPong.abi.Events["CountIncrBeforeFundingSet"].ID: return _SelfFundedPingPong.ParseCountIncrBeforeFundingSet(log) case _SelfFundedPingPong.abi.Events["FeeTokenModified"].ID: @@ -2549,12 +3208,30 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate return _SelfFundedPingPong.ParsePing(log) case _SelfFundedPingPong.abi.Events["Pong"].ID: return _SelfFundedPingPong.ParsePong(log) + case _SelfFundedPingPong.abi.Events["TokensWithdrawnByOwner"].ID: + return _SelfFundedPingPong.ParseTokensWithdrawnByOwner(log) default: return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) } } +func (SelfFundedPingPongApprovedSenderModified) Topic() common.Hash { + return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +} + +func (SelfFundedPingPongCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (SelfFundedPingPongChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (SelfFundedPingPongChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + func (SelfFundedPingPongCountIncrBeforeFundingSet) Topic() common.Hash { return common.HexToHash("0x4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf3") } @@ -2611,12 +3288,16 @@ func (SelfFundedPingPongPong) Topic() common.Hash { return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") } +func (SelfFundedPingPongTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + func (_SelfFundedPingPong *SelfFundedPingPong) Address() common.Address { return _SelfFundedPingPong.address } type SelfFundedPingPongInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) ([]byte, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) @@ -2650,18 +3331,18 @@ type SelfFundedPingPongInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*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) - - 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) + ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) @@ -2680,7 +3361,7 @@ type SelfFundedPingPongInterface 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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2688,6 +3369,30 @@ type SelfFundedPingPongInterface interface { Receive(opts *bind.TransactOpts) (*types.Transaction, error) + FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderModifiedIterator, error) + + WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderModified(log types.Log) (*SelfFundedPingPongApprovedSenderModified, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*SelfFundedPingPongCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*SelfFundedPingPongCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts) (*SelfFundedPingPongChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*SelfFundedPingPongChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*SelfFundedPingPongChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*SelfFundedPingPongChainRemoved, error) + FilterCountIncrBeforeFundingSet(opts *bind.FilterOpts) (*SelfFundedPingPongCountIncrBeforeFundingSetIterator, error) WatchCountIncrBeforeFundingSet(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongCountIncrBeforeFundingSet) (event.Subscription, error) @@ -2772,6 +3477,12 @@ type SelfFundedPingPongInterface interface { ParsePong(log types.Log) (*SelfFundedPingPongPong, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*SelfFundedPingPongTokensWithdrawnByOwnerIterator, error) + + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokensWithdrawnByOwner(log types.Log) (*SelfFundedPingPongTokensWithdrawnByOwner, error) + ParseLog(log types.Log) (generated.AbigenLog, error) Address() common.Address diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 0984f42d93..2e1bbdfadb 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 7f7045fe8bd0d0a5bfb69a74cb782c1def4e40c6690f78f3686abf8702411cca -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0aa9dc4d97b89bbd3fb273d1386b8bd46b2d8c5fa2a4e26cc0ab0589b20c7269 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 02a339415eb7dc90e167a7122beeed340b4171930b28646df16432e692f05b6d -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 96fade4180f686c927f7a599ba18a29efd05df117e1d31b57427b16cfcda370f +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin d16b1843e9cc61c9ad4dcb75f69c45144c382f8d51d9b72888993ca18e594207 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 5863d38eaa2471878113f425c54bfe936db105bf5134ace7b231290c11df7fb7 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin becb56686bc251796f317159533d5c81ea034f5bb043f8f1d14d77be3bd5d1ac +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 40952c2869c3dadef3af5407a1183e451c2d19610aa6e39e92f6c3682bbbf194 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -28,11 +28,11 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin d41d1f20d767c4b050045a1909e6d7a87e919f0fd3a17831e1fe455c87a21e1d +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 7ac6fd85e962789cefe150a0959a79e02772c84658b02f89d09aa99853b5f3f3 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 9dd31e03f6c414fc8961e95515962039f093f35d0f27bfde32fce5add2b6d15a +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin a438934d16529ff5d422f375cdff1c6e11212bdda4e77fb6ee68cf11cb1a930d 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 96b9b3200e409c71c2e03eadb601a1b4a016c636 Mon Sep 17 00:00:00 2001 From: Matt Yang Date: Tue, 9 Jul 2024 10:37:42 -0400 Subject: [PATCH 33/61] pair review comments --- .../v0.8/ccip/applications/external/CCIPBase.sol | 12 +++++++++--- .../ccip/applications/external/CCIPClient.sol | 4 ++++ .../ccip/applications/external/CCIPReceiver.sol | 12 ++++++------ .../applications/external/CCIPReceiverWithACK.sol | 15 ++++++++++++--- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 5974e79b70..86ece0a049 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -22,17 +22,20 @@ abstract contract CCIPBase is OwnerIsCreator { event CCIPRouterModified(address indexed oldRouter, address indexed newRouter); event TokensWithdrawnByOwner(address indexed token, address indexed to, uint256 amount); + + // TODO 2 events, add/remove + // TODO comment on the tradeoffs, short comment on why prefer indexed event ApprovedSenderModified(uint64 indexed destChainSelector, bytes indexed recipient, bool isBeingApproved); - event ChainAdded(uint64 remoteChainSelector, bytes recipient, bytes extraArgsBytes); - event ChainRemoved(uint64 removeChainSelector); + event ChainAdded(uint64 indexed remoteChainSelector, bytes indexed recipient, bytes extraArgsBytes); + event ChainRemoved(uint64 indexed removeChainSelector); struct ApprovedSenderUpdate { uint64 destChainSelector; // Chainselector for a source chain that is allowed to call this dapp bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } - struct ChainUpdate { + struct ChainUpdate { // TODO comments uint64 chainSelector; bool allowed; bytes recipient; @@ -138,6 +141,8 @@ abstract contract CCIPBase is OwnerIsCreator { // │ Chain Management │ // ================================================================ + // TODO comments + // TODO name as updateRouter function modifyRouter(address newRouter) external onlyOwner { if (newRouter == address(0)) revert ZeroAddressNotAllowed(); @@ -172,6 +177,7 @@ abstract contract CCIPBase is OwnerIsCreator { } } + // TODO comments modifier isValidChain(uint64 chainSelector) { // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index f22837b995..6da2db8bd9 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -12,12 +12,14 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// @title CCIPClient /// @notice This contract implements logic for sending and receiving CCIP Messages. It utilizes CCIPReceiver's defensive patterns by default. /// @dev CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated +// TODO make CCIPClient inherit from CCIPReceiver contract CCIPClient is CCIPReceiverWithACK { using SafeERC20 for IERC20; constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} /// @notice sends a message through CCIP to the router + // TODO really beef up the comments here function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, @@ -48,6 +50,8 @@ contract CCIPClient is CCIPReceiverWithACK { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } + // TODO comment we only have messageId after calling ccipSend, so brekaing CEI is necessary + // messageId clac lives in OnRamp, which can be upgradaed, this it should be abstracted away from client impl messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( destChainSelector, message ); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 4e071669f7..4b38c6a2d6 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -9,7 +9,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; /// @title CCIPReceiver -/// @notice This contract is capable of receiving incoming messages from the CCIP-Router. +/// @notice This contract is capable of receiving incoming messages from the CCIP Router. /// @dev This contract implements various "defensive" measures to enhance security and efficiency. These include the ability to implement custom-retry logic and ownership-based token-recovery functions. contract CCIPReceiver is CCIPBase { using SafeERC20 for IERC20; @@ -28,7 +28,6 @@ contract CCIPReceiver is CCIPBase { FAILED, // FAILED messages are messages which reverted during execution of processMessage() as part of the ccipReceive() try catch loop. ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable, and can only be triggered by the contract owner. // Only a message that was previously marked as FAILED can be abandoned. - } // The message contents of failed messages are stored here. @@ -51,7 +50,7 @@ contract CCIPReceiver is CCIPBase { external virtual onlyRouter - isValidChain(message.sourceChainSelector) + isValidChain(message.sourceChainSelector) // TODO should it validate sender as well? { try this.processMessage(message) {} catch (bytes memory err) { @@ -90,7 +89,7 @@ contract CCIPReceiver is CCIPBase { /// @notice Executes a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. - /// @dev Function will revert if the messageId was not already stored as having failed its initial execution + /// 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); @@ -110,14 +109,15 @@ contract CCIPReceiver is CCIPBase { /// @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 abandonFailedMessage(), withdrawNativeTokens(), or withdrawTokens() should be used instead - /// @dev This function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden + /// This function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner { // TODO how about we add a default implementation that calls `processMessage`, and comments for overrides + // The idea is to vend an example that works somewhat well out of the box } /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried /// @dev function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. - /// @dev function is only callable by the contract owner + /// function is only callable by the contract owner function abandonFailedMessage(bytes32 messageId, address receiver) external onlyOwner { if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 7bda3e9163..5b598a6e14 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -11,6 +11,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; /// @title CCIPReceiverWithACK +/// TODO Beef this up contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -20,14 +21,19 @@ contract CCIPReceiverWithACK is CCIPReceiver { event MessageAckSent(bytes32 incomingMessageId); event MessageSent(bytes32 indexed incomingMessageId, bytes32 indexed ACKMessageId); + // TODO named var event MessageAckReceived(bytes32); event FeeTokenModified(address indexed oldToken, address indexed newToken); + // TODO comments on OUTGOING vs. ACK, and OUTGOING is set in a child + // TODO consider moving this to CCIPClienWithACK because CCIPReceiver does not need to be aware of send/receives + // it is only concerned about receiving enum MessageType { OUTGOING, ACK } + // TODO comments enum MessageStatus { QUIET, SENT, @@ -73,6 +79,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit FeeTokenModified(oldFeeToken, token); } + // TODO review if this just be inherited /// @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. @@ -97,14 +104,16 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageSucceeded(message.messageId); } - /// @notice Application-specific logic for incoming ccip-messages. + /// @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. + /// 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)); + // TODO CCIReceiverWithACK can just ack without message type checks + // message type is a concept with ClientWithACK if (payload.messageType == MessageType.OUTGOING) { - // Insert Processing workflow here. + // Insert processing workflow here. // If the message was outgoing on the source chain, then send an ack response. _sendAck(message); From c94eac409f844582cf2f1f7987d2e740d51de525 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, 9 Jul 2024 14:46:05 +0000 Subject: [PATCH 34/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 58 ++++++++++++++----- .../generated/ccipReceiver/ccipReceiver.go | 58 ++++++++++++++----- .../ccip/generated/ccipSender/ccipSender.go | 58 ++++++++++++++----- .../ping_pong_demo/ping_pong_demo.go | 58 ++++++++++++++----- .../self_funded_ping_pong.go | 58 ++++++++++++++----- ...rapper-dependency-versions-do-not-edit.txt | 12 ++-- 6 files changed, 221 insertions(+), 81 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index e0381ce5fc..9c06dba41a 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,8 +56,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\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004ac138038062004ac1833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b614423806200069e6000396000f3fe6080604052600436106101795760003560e01c806379ba5097116100cb578063b0f479a11161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063b0f479a11461043d578063cf6730f814610468578063e4ca87541461048857600080fd5b806385572ffb116100b057806385572ffb146103b15780638da5cb5b146103d15780639fe74e261461041d57600080fd5b806379ba50971461037c5780638462a2b91461039157600080fd5b80635075a9d41161012d5780636939cd97116101075780636939cd97146102d95780636d62d633146103065780636fef519e1461032657600080fd5b80635075a9d41461026b578063536c6bfa146102995780635e35359e146102b957600080fd5b806311e85dff1161015e57806311e85dff146101fb57806335f170ef1461021d5780634e12498b1461024b57600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a036600461328d565b60096020526000908152604090205460ff1681565b6040516101c291906132d5565b60405180910390f35b3480156101d757600080fd5b506101eb6101e636600461332c565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b6102163660046133d3565b610553565b005b34801561022957600080fd5b5061023d6102383660046133f0565b6106c7565b6040516101c292919061347b565b34801561025757600080fd5b5061021b6102663660046133d3565b6107f3565b34801561027757600080fd5b5061028b61028636600461328d565b6108bf565b6040519081526020016101c2565b3480156102a557600080fd5b5061021b6102b43660046134a9565b6108d2565b3480156102c557600080fd5b5061021b6102d43660046134d5565b610936565b3480156102e557600080fd5b506102f96102f436600461328d565b6109cb565b6040516101c29190613573565b34801561031257600080fd5b5061021b610321366004613607565b610bd6565b34801561033257600080fd5b5061036f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c29190613637565b34801561038857600080fd5b5061021b610ef0565b34801561039d57600080fd5b5061021b6103ac366004613696565b610fed565b3480156103bd57600080fd5b5061021b6103cc366004613702565b61134e565b3480156103dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561042957600080fd5b5061021b61043836600461373d565b61165b565b34801561044957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103f8565b34801561047457600080fd5b5061021b610483366004613702565b6119db565b34801561049457600080fd5b5061021b6104a336600461328d565b611c22565b61028b6104b63660046138e5565b611e8c565b3480156104c757600080fd5b5061021b6104d63660046133d3565b6123c2565b3480156104e757600080fd5b506008546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061053790859085906139f2565b9081526040519081900360200190205460ff1690509392505050565b61055b6123d6565b60085473ffffffffffffffffffffffffffffffffffffffff16156105bc576105bc61059b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612459565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106695761066961062960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612659565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6003602052600090815260409020805481906106e290613a02565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90613a02565b801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b50505050509080600101805461077090613a02565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613a02565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905082565b6107fb6123d6565b73ffffffffffffffffffffffffffffffffffffffff8116610848576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006108cc60058361275d565b92915050565b6108da6123d6565b6108e48282612770565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61093e6123d6565b61095f73ffffffffffffffffffffffffffffffffffffffff841683836128ca565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109be91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a3a90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690613a02565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600382018054610acc90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890613a02565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bc85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b73565b505050915250909392505050565b610bde6123d6565b6001610beb60058461275d565b14610c2a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c3a8260025b60059190612920565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c8290613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae90613a02565b8015610cfb5780601f10610cd057610100808354040283529160200191610cfb565b820191906000526020600020905b815481529060010190602001808311610cde57829003601f168201915b50505050508152602001600382018054610d1490613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090613a02565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dbb565b5050505081525050905060005b816080015151811015610e9f57610e978383608001518381518110610e4457610e44613a55565b60200260200101516020015184608001518481518110610e6657610e66613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128ca9092919063ffffffff16565b600101610e1d565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c21565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ff56123d6565b60005b81811015611198576003600084848481811061101657611016613a55565b90506020028101906110289190613a84565b6110369060208101906133f0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061106d5761106d613a55565b905060200281019061107f9190613a84565b61108d906020810190613ac2565b60405161109b9291906139f2565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110e2576110e2613a55565b90506020028101906110f49190613a84565b611102906020810190613ac2565b6040516111109291906139f2565b604051809103902083838381811061112a5761112a613a55565b905060200281019061113c9190613a84565b61114a9060208101906133f0565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611188911515815260200190565b60405180910390a3600101610ff8565b5060005b83811015611347576001600360008787858181106111bc576111bc613a55565b90506020028101906111ce9190613a84565b6111dc9060208101906133f0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061121357611213613a55565b90506020028101906112259190613a84565b611233906020810190613ac2565b6040516112419291906139f2565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061129157611291613a55565b90506020028101906112a39190613a84565b6112b1906020810190613ac2565b6040516112bf9291906139f2565b60405180910390208585838181106112d9576112d9613a55565b90506020028101906112eb9190613a84565b6112f99060208101906133f0565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611337911515815260200190565b60405180910390a360010161119c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113a1576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c21565b6113b160408201602083016133f0565b6113be6040830183613ac2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061141592509050613a02565b1590508061146b5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516114569190613b27565b9081526040519081900360200190205460ff16155b156114a457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c219190613637565b6114b460408401602085016133f0565b67ffffffffffffffff81166000908152600360205260409020805481906114da90613a02565b9050600003611521576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061155d908890600401613c3b565b600060405180830381600087803b15801561157757600080fd5b505af1925050508015611588575060015b611628573d8080156115b6576040519150601f19603f3d011682016040523d82523d6000602084013e6115bb565b606091505b506115c886356001610c31565b508535600090815260046020526040902086906115e58282614015565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061161a908490613637565b60405180910390a250611347565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6116636123d6565b60005b818110156119d65782828281811061168057611680613a55565b9050602002810190611692919061410f565b6116a3906040810190602001614151565b61177657600360008484848181106116bd576116bd613a55565b90506020028101906116cf919061410f565b6116dd9060208101906133f0565b67ffffffffffffffff168152602081019190915260400160009081206117029161323f565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991683838381811061173557611735613a55565b9050602002810190611747919061410f565b6117559060208101906133f0565b60405167ffffffffffffffff909116815260200160405180910390a16119ce565b82828281811061178857611788613a55565b905060200281019061179a919061410f565b6117a8906040810190613ac2565b90506000036117e3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106117fb576117fb613a55565b905060200281019061180d919061410f565b61181b9060208101906133f0565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061185157611851613a55565b9050602002810190611863919061410f565b611871906040810190613ac2565b829161187e919083613d99565b5083838381811061189157611891613a55565b90506020028101906118a3919061410f565b6118b1906060810190613ac2565b1590506118fc578383838181106118ca576118ca613a55565b90506020028101906118dc919061410f565b6118ea906060810190613ac2565b60018301916118fa919083613d99565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284848481811061192f5761192f613a55565b9050602002810190611941919061410f565b61194f9060208101906133f0565b85858581811061196157611961613a55565b9050602002810190611973919061410f565b611981906040810190613ac2565b87878781811061199357611993613a55565b90506020028101906119a5919061410f565b6119b3906060810190613ac2565b6040516119c495949392919061416e565b60405180910390a1505b600101611666565b505050565b333014611a14576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a236060830183613ac2565b810190611a3091906141b1565b9050600081604001516001811115611a4a57611a4a6132a6565b03611a5c57611a5882612935565b5050565b600181604001516001811115611a7457611a746132a6565b03611a58576000808260200151806020019051810190611a94919061425d565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611ade9190613637565b6040516020818303038152906040528051906020012082604051602001611b059190613637565b6040516020818303038152906040528051906020012014611b52576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526009602052604090205460ff166002811115611b7757611b776132a6565b03611bb1576040517f33704b2800000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b6001611c2f60058361275d565b14611c69576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b611c74816000610c31565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cbc90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce890613a02565b8015611d355780601f10611d0a57610100808354040283529160200191611d35565b820191906000526020600020905b815481529060010190602001808311611d1857829003601f168201915b50505050508152602001600382018054611d4e90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7a90613a02565b8015611dc75780601f10611d9c57610100808354040283529160200191611dc7565b820191906000526020600020905b815481529060010190602001808311611daa57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e4a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611df5565b50505050815250509050611e5d81612cab565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611eb590613a02565b9050600003611efc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f2c90613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5890613a02565b8015611fa55780601f10611f7a57610100808354040283529160200191611fa5565b820191906000526020600020905b815481529060010190602001808311611f8857829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161200690613a02565b80601f016020809104026020016040519081016040528092919081815260200182805461203290613a02565b801561207f5780601f106120545761010080835404028352916020019161207f565b820191906000526020600020905b81548152906001019060200180831161206257829003601f168201915b5050505050815250905060005b86518110156121dc576120fc33308984815181106120ac576120ac613a55565b6020026020010151602001518a85815181106120ca576120ca613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612cb3909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061212c5761212c613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121d45760025487516121d49173ffffffffffffffffffffffffffffffffffffffff169089908490811061218557612185613a55565b6020026020010151602001518984815181106121a3576121a3613a55565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124599092919063ffffffff16565b60010161208c565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612236908b9086906004016142de565b602060405180830381865afa158015612253573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227791906143ab565b60085490915073ffffffffffffffffffffffffffffffffffffffff16156122bd576008546122bd9073ffffffffffffffffffffffffffffffffffffffff16333084612cb3565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156122ef5760006122f1565b825b8a856040518463ffffffff1660e01b81526004016123109291906142de565b60206040518083038185885af115801561232e573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061235391906143ab565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6123ca6123d6565b6123d381612d11565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c21565b565b8015806124f957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906143ab565b155b612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119d69084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e06565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f491906143ab565b6126fe91906143c4565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506127579085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125d7565b50505050565b60006127698383612f12565b9392505050565b804710156127da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c21565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612834576040519150601f19603f3d011682016040523d82523d6000602084013e612839565b606091505b50509050806119d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119d69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125d7565b600061292d848484612f9c565b949350505050565b6040805160008082526020820190925281612972565b604080518082019091526000808252602082015281526020019060019003908161294b5790505b50905060006040518060a001604052808480604001906129929190613ac2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612a1392883591016143d7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612a839189019089016133f0565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612ab390613a02565b80601f0160208091040260200160405190810160405280929190818152602001828054612adf90613a02565b8015612b2c5780601f10612b0157610100808354040283529160200191612b2c565b820191906000526020600020905b815481529060010190602001808311612b0f57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612b6960408701602088016133f0565b846040518363ffffffff1660e01b8152600401612b879291906142de565b602060405180830381865afa158015612ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc891906143ab565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612c00576000612c02565b835b612c126040890160208a016133f0565b866040518463ffffffff1660e01b8152600401612c309291906142de565b60206040518083038185885af1158015612c4e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c7391906143ab565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b6123d36123d6565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526127579085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016125d7565b3373ffffffffffffffffffffffffffffffffffffffff821603612d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c21565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612e68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fb99092919063ffffffff16565b8051909150156119d65780806020019051810190612e8691906143f9565b6119d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c21565b600081815260028301602052604081205480151580612f365750612f368484612fc8565b612769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c21565b6000828152600284016020526040812082905561292d8484612fd4565b606061292d8484600085612fe0565b600061276983836130f9565b60006127698383613111565b606082471015613072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c21565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161309b9190613b27565b60006040518083038185875af1925050503d80600081146130d8576040519150601f19603f3d011682016040523d82523d6000602084013e6130dd565b606091505b50915091506130ee87838387613160565b979650505050505050565b60008181526001830160205260408120541515612769565b6000818152600183016020526040812054613158575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108cc565b5060006108cc565b606083156131f65782516000036131ef5773ffffffffffffffffffffffffffffffffffffffff85163b6131ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c21565b508161292d565b61292d838381511561320b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c219190613637565b50805461324b90613a02565b6000825580601f1061325b575050565b601f0160209004906000526020600020908101906123d391905b808211156132895760008155600101613275565b5090565b60006020828403121561329f57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613310577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146123d357600080fd5b60008060006040848603121561334157600080fd5b833561334c81613316565b9250602084013567ffffffffffffffff8082111561336957600080fd5b818601915086601f83011261337d57600080fd5b81358181111561338c57600080fd5b87602082850101111561339e57600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146123d357600080fd5b6000602082840312156133e557600080fd5b8135612769816133b1565b60006020828403121561340257600080fd5b813561276981613316565b60005b83811015613428578181015183820152602001613410565b50506000910152565b6000815180845261344981602086016020860161340d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061348e6040830185613431565b82810360208401526134a08185613431565b95945050505050565b600080604083850312156134bc57600080fd5b82356134c7816133b1565b946020939093013593505050565b6000806000606084860312156134ea57600080fd5b83356134f5816133b1565b92506020840135613505816133b1565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613568578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161352b565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135ad60c0840182613431565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526135e98383613431565b925060808601519150808584030160a0860152506134a08282613516565b6000806040838503121561361a57600080fd5b82359150602083013561362c816133b1565b809150509250929050565b6020815260006127696020830184613431565b60008083601f84011261365c57600080fd5b50813567ffffffffffffffff81111561367457600080fd5b6020830191508360208260051b850101111561368f57600080fd5b9250929050565b600080600080604085870312156136ac57600080fd5b843567ffffffffffffffff808211156136c457600080fd5b6136d08883890161364a565b909650945060208701359150808211156136e957600080fd5b506136f68782880161364a565b95989497509550505050565b60006020828403121561371457600080fd5b813567ffffffffffffffff81111561372b57600080fd5b820160a0818503121561276957600080fd5b6000806020838503121561375057600080fd5b823567ffffffffffffffff81111561376757600080fd5b6137738582860161364a565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156137d1576137d161377f565b60405290565b6040516060810167ffffffffffffffff811182821017156137d1576137d161377f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138415761384161377f565b604052919050565b600067ffffffffffffffff8211156138635761386361377f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126138a057600080fd5b81356138b36138ae82613849565b6137fa565b8181528460208386010111156138c857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156138fa57600080fd5b833561390581613316565b925060208481013567ffffffffffffffff8082111561392357600080fd5b818701915087601f83011261393757600080fd5b8135818111156139495761394961377f565b613957848260051b016137fa565b81815260069190911b8301840190848101908a83111561397657600080fd5b938501935b828510156139c2576040858c0312156139945760008081fd5b61399c6137ae565b85356139a7816133b1565b8152858701358782015282526040909401939085019061397b565b9650505060408701359250808311156139da57600080fd5b50506139e88682870161388f565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a1657607f821691505b602082108103613a4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613ab857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613af757600080fd5b83018035915067ffffffffffffffff821115613b1257600080fd5b60200191503681900382131561368f57600080fd5b60008251613ab881846020870161340d565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b6e57600080fd5b830160208101925035905067ffffffffffffffff811115613b8e57600080fd5b80360382131561368f57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613568578135613c09816133b1565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613bf6565b602081528135602082015260006020830135613c5681613316565b67ffffffffffffffff8082166040850152613c746040860186613b39565b925060a06060860152613c8b60c086018483613b9d565b925050613c9b6060860186613b39565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613cd1858385613b9d565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613d0a57600080fd5b60209288019283019235915083821115613d2357600080fd5b8160061b3603831315613d3557600080fd5b8685030160a08701526130ee848284613be6565b601f8211156119d6576000816000526020600020601f850160051c81016020861015613d725750805b601f850160051c820191505b81811015613d9157828155600101613d7e565b505050505050565b67ffffffffffffffff831115613db157613db161377f565b613dc583613dbf8354613a02565b83613d49565b6000601f841160018114613e175760008515613de15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611347565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613e665786850135825560209485019460019092019101613e46565b5086821015613ea1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613eed816133b1565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613f5357613f5361377f565b805483825580841015613fe05760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613f9457613f94613eb3565b8086168614613fa557613fa5613eb3565b5060008360005260206000208360011b81018760011b820191505b80821015613fdb578282558284830155600282019150613fc0565b505050505b5060008181526020812083915b85811015613d9157613fff8383613ee2565b6040929092019160029190910190600101613fed565b8135815560018101602083013561402b81613316565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561406b6040860186613ac2565b9350915061407d838360028701613d99565b61408a6060860186613ac2565b9350915061409c838360038701613d99565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126140d357600080fd5b9184019182359150808211156140e857600080fd5b506020820191508060061b360382131561410157600080fd5b612757818360048601613f3a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ab857600080fd5b80151581146123d357600080fd5b60006020828403121561416357600080fd5b813561276981614143565b67ffffffffffffffff86168152606060208201526000614192606083018688613b9d565b82810360408401526141a5818587613b9d565b98975050505050505050565b6000602082840312156141c357600080fd5b813567ffffffffffffffff808211156141db57600080fd5b90830190606082860312156141ef57600080fd5b6141f76137d7565b82358281111561420657600080fd5b6142128782860161388f565b82525060208301358281111561422757600080fd5b6142338782860161388f565b602083015250604083013592506002831061424d57600080fd5b6040810192909252509392505050565b6000806040838503121561427057600080fd5b825167ffffffffffffffff81111561428757600080fd5b8301601f8101851361429857600080fd5b80516142a66138ae82613849565b8181528660208385010111156142bb57600080fd5b6142cc82602083016020860161340d565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a0604084015261430a60e0840182613431565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526143468383613431565b925060408601519150808584030160808601526143638383613516565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143a18282613431565b9695505050505050565b6000602082840312156143bd57600080fd5b5051919050565b808201808211156108cc576108cc613eb3565b6040815260006143ea6040830185613431565b90508260208301529392505050565b60006020828403121561440b57600080fd5b81516127698161414356fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004aa838038062004aa8833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b61440a806200069e6000396000f3fe6080604052600436106101795760003560e01c806379ba5097116100cb578063b0f479a11161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063b0f479a11461043d578063cf6730f814610468578063e4ca87541461048857600080fd5b806385572ffb116100b057806385572ffb146103b15780638da5cb5b146103d15780639fe74e261461041d57600080fd5b806379ba50971461037c5780638462a2b91461039157600080fd5b80635075a9d41161012d5780636939cd97116101075780636939cd97146102d95780636d62d633146103065780636fef519e1461032657600080fd5b80635075a9d41461026b578063536c6bfa146102995780635e35359e146102b957600080fd5b806311e85dff1161015e57806311e85dff146101fb57806335f170ef1461021d5780634e12498b1461024b57600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a03660046132a3565b60096020526000908152604090205460ff1681565b6040516101c291906132eb565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613342565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b6102163660046133e9565b610553565b005b34801561022957600080fd5b5061023d610238366004613406565b6106c7565b6040516101c2929190613491565b34801561025757600080fd5b5061021b6102663660046133e9565b6107f3565b34801561027757600080fd5b5061028b6102863660046132a3565b6108bf565b6040519081526020016101c2565b3480156102a557600080fd5b5061021b6102b43660046134bf565b6108d2565b3480156102c557600080fd5b5061021b6102d43660046134eb565b610936565b3480156102e557600080fd5b506102f96102f43660046132a3565b6109cb565b6040516101c29190613589565b34801561031257600080fd5b5061021b61032136600461361d565b610bd6565b34801561033257600080fd5b5061036f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c2919061364d565b34801561038857600080fd5b5061021b610ef0565b34801561039d57600080fd5b5061021b6103ac3660046136ac565b610fed565b3480156103bd57600080fd5b5061021b6103cc366004613718565b61134e565b3480156103dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561042957600080fd5b5061021b610438366004613753565b61165b565b34801561044957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103f8565b34801561047457600080fd5b5061021b610483366004613718565b6119f1565b34801561049457600080fd5b5061021b6104a33660046132a3565b611c38565b61028b6104b63660046138fb565b611ea2565b3480156104c757600080fd5b5061021b6104d63660046133e9565b6123d8565b3480156104e757600080fd5b506008546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105379085908590613a08565b9081526040519081900360200190205460ff1690509392505050565b61055b6123ec565b60085473ffffffffffffffffffffffffffffffffffffffff16156105bc576105bc61059b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff1690600061246f565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106695761066961062960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61266f565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6003602052600090815260409020805481906106e290613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90613a18565b801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b50505050509080600101805461077090613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613a18565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905082565b6107fb6123ec565b73ffffffffffffffffffffffffffffffffffffffff8116610848576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006108cc600583612773565b92915050565b6108da6123ec565b6108e48282612786565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61093e6123ec565b61095f73ffffffffffffffffffffffffffffffffffffffff841683836128e0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109be91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a3a90613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690613a18565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600382018054610acc90613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890613a18565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bc85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b73565b505050915250909392505050565b610bde6123ec565b6001610beb600584612773565b14610c2a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c3a8260025b60059190612936565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c8290613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae90613a18565b8015610cfb5780601f10610cd057610100808354040283529160200191610cfb565b820191906000526020600020905b815481529060010190602001808311610cde57829003601f168201915b50505050508152602001600382018054610d1490613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090613a18565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dbb565b5050505081525050905060005b816080015151811015610e9f57610e978383608001518381518110610e4457610e44613a6b565b60200260200101516020015184608001518481518110610e6657610e66613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128e09092919063ffffffff16565b600101610e1d565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c21565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ff56123ec565b60005b81811015611198576003600084848481811061101657611016613a6b565b90506020028101906110289190613a9a565b611036906020810190613406565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061106d5761106d613a6b565b905060200281019061107f9190613a9a565b61108d906020810190613ad8565b60405161109b929190613a08565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110e2576110e2613a6b565b90506020028101906110f49190613a9a565b611102906020810190613ad8565b604051611110929190613a08565b604051809103902083838381811061112a5761112a613a6b565b905060200281019061113c9190613a9a565b61114a906020810190613406565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611188911515815260200190565b60405180910390a3600101610ff8565b5060005b83811015611347576001600360008787858181106111bc576111bc613a6b565b90506020028101906111ce9190613a9a565b6111dc906020810190613406565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061121357611213613a6b565b90506020028101906112259190613a9a565b611233906020810190613ad8565b604051611241929190613a08565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061129157611291613a6b565b90506020028101906112a39190613a9a565b6112b1906020810190613ad8565b6040516112bf929190613a08565b60405180910390208585838181106112d9576112d9613a6b565b90506020028101906112eb9190613a9a565b6112f9906020810190613406565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611337911515815260200190565b60405180910390a360010161119c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113a1576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c21565b6113b16040820160208301613406565b6113be6040830183613ad8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061141592509050613a18565b1590508061146b5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516114569190613b3d565b9081526040519081900360200190205460ff16155b156114a457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c21919061364d565b6114b46040840160208501613406565b67ffffffffffffffff81166000908152600360205260409020805481906114da90613a18565b9050600003611521576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061155d908890600401613c51565b600060405180830381600087803b15801561157757600080fd5b505af1925050508015611588575060015b611628573d8080156115b6576040519150601f19603f3d011682016040523d82523d6000602084013e6115bb565b606091505b506115c886356001610c31565b508535600090815260046020526040902086906115e5828261402b565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061161a90849061364d565b60405180910390a250611347565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6116636123ec565b60005b818110156119ec5782828281811061168057611680613a6b565b90506020028101906116929190614125565b6116a3906040810190602001614167565b61176f57600360008484848181106116bd576116bd613a6b565b90506020028101906116cf9190614125565b6116dd906020810190613406565b67ffffffffffffffff1681526020810191909152604001600090812061170291613255565b82828281811061171457611714613a6b565b90506020028101906117269190614125565b611734906020810190613406565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26119e4565b82828281811061178157611781613a6b565b90506020028101906117939190614125565b6117a1906040810190613ad8565b90506000036117dc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106117f4576117f4613a6b565b90506020028101906118069190614125565b611814906020810190613406565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061184a5761184a613a6b565b905060200281019061185c9190614125565b61186a906040810190613ad8565b8291611877919083613daf565b5083838381811061188a5761188a613a6b565b905060200281019061189c9190614125565b6118aa906060810190613ad8565b1590506118f5578383838181106118c3576118c3613a6b565b90506020028101906118d59190614125565b6118e3906060810190613ad8565b60018301916118f3919083613daf565b505b83838381811061190757611907613a6b565b90506020028101906119199190614125565b611927906040810190613ad8565b604051611935929190613a08565b604051809103902084848481811061194f5761194f613a6b565b90506020028101906119619190614125565b61196f906020810190613406565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106119ac576119ac613a6b565b90506020028101906119be9190614125565b6119cc906060810190613ad8565b6040516119da929190614184565b60405180910390a3505b600101611666565b505050565b333014611a2a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a396060830183613ad8565b810190611a469190614198565b9050600081604001516001811115611a6057611a606132bc565b03611a7257611a6e8261294b565b5050565b600181604001516001811115611a8a57611a8a6132bc565b03611a6e576000808260200151806020019051810190611aaa9190614244565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611af4919061364d565b6040516020818303038152906040528051906020012082604051602001611b1b919061364d565b6040516020818303038152906040528051906020012014611b68576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526009602052604090205460ff166002811115611b8d57611b8d6132bc565b03611bc7576040517f33704b2800000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b6001611c45600583612773565b14611c7f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b611c8a816000610c31565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cd290613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90613a18565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b50505050508152602001600382018054611d6490613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9090613a18565b8015611ddd5780601f10611db257610100808354040283529160200191611ddd565b820191906000526020600020905b815481529060010190602001808311611dc057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e605760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611e0b565b50505050815250509050611e7381612cc1565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ecb90613a18565b9050600003611f12576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f4290613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6e90613a18565b8015611fbb5780601f10611f9057610100808354040283529160200191611fbb565b820191906000526020600020905b815481529060010190602001808311611f9e57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161201c90613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461204890613a18565b80156120955780601f1061206a57610100808354040283529160200191612095565b820191906000526020600020905b81548152906001019060200180831161207857829003601f168201915b5050505050815250905060005b86518110156121f25761211233308984815181106120c2576120c2613a6b565b6020026020010151602001518a85815181106120e0576120e0613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612cc9909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061214257612142613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121ea5760025487516121ea9173ffffffffffffffffffffffffffffffffffffffff169089908490811061219b5761219b613a6b565b6020026020010151602001518984815181106121b9576121b9613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661246f9092919063ffffffff16565b6001016120a2565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded9061224c908b9086906004016142c5565b602060405180830381865afa158015612269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228d9190614392565b60085490915073ffffffffffffffffffffffffffffffffffffffff16156122d3576008546122d39073ffffffffffffffffffffffffffffffffffffffff16333084612cc9565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612305576000612307565b825b8a856040518463ffffffff1660e01b81526004016123269291906142c5565b60206040518083038185885af1158015612344573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123699190614392565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6123e06123ec565b6123e981612d27565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c21565b565b80158061250f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614392565b155b61259b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119ec9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e1c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270a9190614392565b61271491906143ab565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061276d9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125ed565b50505050565b600061277f8383612f28565b9392505050565b804710156127f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c21565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461284a576040519150601f19603f3d011682016040523d82523d6000602084013e61284f565b606091505b50509050806119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125ed565b6000612943848484612fb2565b949350505050565b6040805160008082526020820190925281612988565b60408051808201909152600080825260208201528152602001906001900390816129615790505b50905060006040518060a001604052808480604001906129a89190613ad8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612a2992883591016143be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612a99918901908901613406565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612ac990613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054612af590613a18565b8015612b425780601f10612b1757610100808354040283529160200191612b42565b820191906000526020600020905b815481529060010190602001808311612b2557829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612b7f6040870160208801613406565b846040518363ffffffff1660e01b8152600401612b9d9291906142c5565b602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190614392565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612c16576000612c18565b835b612c286040890160208a01613406565b866040518463ffffffff1660e01b8152600401612c469291906142c5565b60206040518083038185885af1158015612c64573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c899190614392565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b6123e96123ec565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261276d9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016125ed565b3373ffffffffffffffffffffffffffffffffffffffff821603612da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c21565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612e7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b8051909150156119ec5780806020019051810190612e9c91906143e0565b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c21565b600081815260028301602052604081205480151580612f4c5750612f4c8484612fde565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c21565b600082815260028401602052604081208290556129438484612fea565b60606129438484600085612ff6565b600061277f838361310f565b600061277f8383613127565b606082471015613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c21565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130b19190613b3d565b60006040518083038185875af1925050503d80600081146130ee576040519150601f19603f3d011682016040523d82523d6000602084013e6130f3565b606091505b509150915061310487838387613176565b979650505050505050565b6000818152600183016020526040812054151561277f565b600081815260018301602052604081205461316e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108cc565b5060006108cc565b6060831561320c5782516000036132055773ffffffffffffffffffffffffffffffffffffffff85163b613205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c21565b5081612943565b61294383838151156132215781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c21919061364d565b50805461326190613a18565b6000825580601f10613271575050565b601f0160209004906000526020600020908101906123e991905b8082111561329f576000815560010161328b565b5090565b6000602082840312156132b557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613326577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146123e957600080fd5b60008060006040848603121561335757600080fd5b83356133628161332c565b9250602084013567ffffffffffffffff8082111561337f57600080fd5b818601915086601f83011261339357600080fd5b8135818111156133a257600080fd5b8760208285010111156133b457600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146123e957600080fd5b6000602082840312156133fb57600080fd5b813561277f816133c7565b60006020828403121561341857600080fd5b813561277f8161332c565b60005b8381101561343e578181015183820152602001613426565b50506000910152565b6000815180845261345f816020860160208601613423565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006134a46040830185613447565b82810360208401526134b68185613447565b95945050505050565b600080604083850312156134d257600080fd5b82356134dd816133c7565b946020939093013593505050565b60008060006060848603121561350057600080fd5b833561350b816133c7565b9250602084013561351b816133c7565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561357e578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613541565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135c360c0840182613447565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526135ff8383613447565b925060808601519150808584030160a0860152506134b6828261352c565b6000806040838503121561363057600080fd5b823591506020830135613642816133c7565b809150509250929050565b60208152600061277f6020830184613447565b60008083601f84011261367257600080fd5b50813567ffffffffffffffff81111561368a57600080fd5b6020830191508360208260051b85010111156136a557600080fd5b9250929050565b600080600080604085870312156136c257600080fd5b843567ffffffffffffffff808211156136da57600080fd5b6136e688838901613660565b909650945060208701359150808211156136ff57600080fd5b5061370c87828801613660565b95989497509550505050565b60006020828403121561372a57600080fd5b813567ffffffffffffffff81111561374157600080fd5b820160a0818503121561277f57600080fd5b6000806020838503121561376657600080fd5b823567ffffffffffffffff81111561377d57600080fd5b61378985828601613660565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156137e7576137e7613795565b60405290565b6040516060810167ffffffffffffffff811182821017156137e7576137e7613795565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385757613857613795565b604052919050565b600067ffffffffffffffff82111561387957613879613795565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126138b657600080fd5b81356138c96138c48261385f565b613810565b8181528460208386010111156138de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561391057600080fd5b833561391b8161332c565b925060208481013567ffffffffffffffff8082111561393957600080fd5b818701915087601f83011261394d57600080fd5b81358181111561395f5761395f613795565b61396d848260051b01613810565b81815260069190911b8301840190848101908a83111561398c57600080fd5b938501935b828510156139d8576040858c0312156139aa5760008081fd5b6139b26137c4565b85356139bd816133c7565b81528587013587820152825260409094019390850190613991565b9650505060408701359250808311156139f057600080fd5b50506139fe868287016138a5565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a2c57607f821691505b602082108103613a65577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613ace57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b0d57600080fd5b83018035915067ffffffffffffffff821115613b2857600080fd5b6020019150368190038213156136a557600080fd5b60008251613ace818460208701613423565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b8457600080fd5b830160208101925035905067ffffffffffffffff811115613ba457600080fd5b8036038213156136a557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561357e578135613c1f816133c7565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613c0c565b602081528135602082015260006020830135613c6c8161332c565b67ffffffffffffffff8082166040850152613c8a6040860186613b4f565b925060a06060860152613ca160c086018483613bb3565b925050613cb16060860186613b4f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613ce7858385613bb3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613d2057600080fd5b60209288019283019235915083821115613d3957600080fd5b8160061b3603831315613d4b57600080fd5b8685030160a0870152613104848284613bfc565b601f8211156119ec576000816000526020600020601f850160051c81016020861015613d885750805b601f850160051c820191505b81811015613da757828155600101613d94565b505050505050565b67ffffffffffffffff831115613dc757613dc7613795565b613ddb83613dd58354613a18565b83613d5f565b6000601f841160018114613e2d5760008515613df75750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611347565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613e7c5786850135825560209485019460019092019101613e5c565b5086821015613eb7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613f03816133c7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613f6957613f69613795565b805483825580841015613ff65760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613faa57613faa613ec9565b8086168614613fbb57613fbb613ec9565b5060008360005260206000208360011b81018760011b820191505b80821015613ff1578282558284830155600282019150613fd6565b505050505b5060008181526020812083915b85811015613da7576140158383613ef8565b6040929092019160029190910190600101614003565b813581556001810160208301356140418161332c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556140816040860186613ad8565b93509150614093838360028701613daf565b6140a06060860186613ad8565b935091506140b2838360038701613daf565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126140e957600080fd5b9184019182359150808211156140fe57600080fd5b506020820191508060061b360382131561411757600080fd5b61276d818360048601613f50565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ace57600080fd5b80151581146123e957600080fd5b60006020828403121561417957600080fd5b813561277f81614159565b602081526000612943602083018486613bb3565b6000602082840312156141aa57600080fd5b813567ffffffffffffffff808211156141c257600080fd5b90830190606082860312156141d657600080fd5b6141de6137ed565b8235828111156141ed57600080fd5b6141f9878286016138a5565b82525060208301358281111561420e57600080fd5b61421a878286016138a5565b602083015250604083013592506002831061423457600080fd5b6040810192909252509392505050565b6000806040838503121561425757600080fd5b825167ffffffffffffffff81111561426e57600080fd5b8301601f8101851361427f57600080fd5b805161428d6138c48261385f565b8181528660208385010111156142a257600080fd5b6142b3826020830160208601613423565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a060408401526142f160e0840182613447565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261432d8383613447565b9250604086015191508085840301608086015261434a838361352c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143888282613447565b9695505050505050565b6000602082840312156143a457600080fd5b5051919050565b808201808211156108cc576108cc613ec9565b6040815260006143d16040830185613447565b90508260208301529392505050565b6000602082840312156143f257600080fd5b815161277f8161415956fea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -905,23 +905,41 @@ func (it *CCIPClientChainAddedIterator) Close() error { type CCIPClientChainAdded struct { RemoteChainSelector uint64 - Recipient []byte + Recipient common.Hash ExtraArgsBytes []byte Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterChainAdded(opts *bind.FilterOpts) (*CCIPClientChainAddedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPClientChainAddedIterator, error) { - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainAdded") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } return &CCIPClientChainAddedIterator{contract: _CCIPClient.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainAdded") + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -1027,18 +1045,28 @@ type CCIPClientChainRemoved struct { Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*CCIPClientChainRemovedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPClientChainRemovedIterator, error) { - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainRemoved") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } return &CCIPClientChainRemovedIterator{contract: _CCIPClient.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainRemoved") + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -2672,15 +2700,15 @@ type CCIPClientInterface interface { ParseCCIPRouterModified(log types.Log) (*CCIPClientCCIPRouterModified, error) - FilterChainAdded(opts *bind.FilterOpts) (*CCIPClientChainAddedIterator, error) + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPClientChainAddedIterator, error) - WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded) (event.Subscription, error) + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) ParseChainAdded(log types.Log) (*CCIPClientChainAdded, error) - FilterChainRemoved(opts *bind.FilterOpts) (*CCIPClientChainRemovedIterator, error) + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPClientChainRemovedIterator, error) - WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved) (event.Subscription, error) + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved, removeChainSelector []uint64) (event.Subscription, error) ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index 5853da23fb..25a0cfc0fb 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -56,8 +56,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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162003067380380620030678339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e6980620001fe6000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a55780639fe74e2611610074578063cf6730f811610059578063cf6730f81461034a578063e4ca87541461036a578063f2fde38b1461038a57600080fd5b80639fe74e26146102ff578063b0f479a11461031f57600080fd5b806379ba50971461025e5780638462a2b91461027357806385572ffb146102935780638da5cb5b146102b357600080fd5b8063536c6bfa116100e1578063536c6bfa146101d15780635e35359e146101f15780636939cd97146102115780636d62d6331461023e57600080fd5b80630e958d6b1461011e57806335f170ef146101535780634e12498b146101815780635075a9d4146101a357600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e6101393660046121e6565b6103aa565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e36600461226b565b6103f5565b60405161014a9291906122f6565b34801561018d57600080fd5b506101a161019c366004612346565b610521565b005b3480156101af57600080fd5b506101c36101be366004612363565b6105ed565b60405190815260200161014a565b3480156101dd57600080fd5b506101a16101ec36600461237c565b610600565b3480156101fd57600080fd5b506101a161020c3660046123a8565b610664565b34801561021d57600080fd5b5061023161022c366004612363565b6106f9565b60405161014a91906123e9565b34801561024a57600080fd5b506101a16102593660046124d0565b610904565b34801561026a57600080fd5b506101a1610c1e565b34801561027f57600080fd5b506101a161028e36600461254c565b610d1b565b34801561029f57600080fd5b506101a16102ae3660046125b8565b61107c565b3480156102bf57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b34801561030b57600080fd5b506101a161031a3660046125f3565b611285565b34801561032b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102da565b34801561035657600080fd5b506101a16103653660046125b8565b611600565b34801561037657600080fd5b506101a1610385366004612363565b61173c565b34801561039657600080fd5b506101a16103a5366004612346565b6119a6565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103d99085908590612635565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061041090612645565b80601f016020809104026020016040519081016040528092919081815260200182805461043c90612645565b80156104895780601f1061045e57610100808354040283529160200191610489565b820191906000526020600020905b81548152906001019060200180831161046c57829003601f168201915b50505050509080600101805461049e90612645565b80601f01602080910402602001604051908101604052809291908181526020018280546104ca90612645565b80156105175780601f106104ec57610100808354040283529160200191610517565b820191906000526020600020905b8154815290600101906020018083116104fa57829003601f168201915b5050505050905082565b6105296119ba565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006105fa600583611a3d565b92915050565b6106086119ba565b6106128282611a50565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61066c6119ba565b61068d73ffffffffffffffffffffffffffffffffffffffff84168383611baa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ec91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161076890612645565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612645565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b505050505081526020016003820180546107fa90612645565b80601f016020809104026020016040519081016040528092919081815260200182805461082690612645565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108a1565b505050915250909392505050565b61090c6119ba565b6001610919600584611a3d565b14610958576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109688260025b60059190611c37565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916109b090612645565b80601f01602080910402602001604051908101604052809291908181526020018280546109dc90612645565b8015610a295780601f106109fe57610100808354040283529160200191610a29565b820191906000526020600020905b815481529060010190602001808311610a0c57829003601f168201915b50505050508152602001600382018054610a4290612645565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90612645565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ae9565b5050505081525050905060005b816080015151811015610bcd57610bc58383608001518381518110610b7257610b72612698565b60200260200101516020015184608001518481518110610b9457610b94612698565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611baa9092919063ffffffff16565b600101610b4b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d236119ba565b60005b81811015610ec65760036000848484818110610d4457610d44612698565b9050602002810190610d5691906126c7565b610d6490602081019061226b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d9b57610d9b612698565b9050602002810190610dad91906126c7565b610dbb906020810190612705565b604051610dc9929190612635565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610e1057610e10612698565b9050602002810190610e2291906126c7565b610e30906020810190612705565b604051610e3e929190612635565b6040518091039020838383818110610e5857610e58612698565b9050602002810190610e6a91906126c7565b610e7890602081019061226b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610eb6911515815260200190565b60405180910390a3600101610d26565b5060005b8381101561107557600160036000878785818110610eea57610eea612698565b9050602002810190610efc91906126c7565b610f0a90602081019061226b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f4157610f41612698565b9050602002810190610f5391906126c7565b610f61906020810190612705565b604051610f6f929190612635565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610fbf57610fbf612698565b9050602002810190610fd191906126c7565b610fdf906020810190612705565b604051610fed929190612635565b604051809103902085858381811061100757611007612698565b905060200281019061101991906126c7565b61102790602081019061226b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611065911515815260200190565b60405180910390a3600101610eca565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146110cf576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094f565b6110df604082016020830161226b565b67ffffffffffffffff811660009081526003602052604090208054819061110590612645565b905060000361114c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611188908690600401612877565b600060405180830381600087803b1580156111a257600080fd5b505af19250505080156111b3575060015b611253573d8080156111e1576040519150601f19603f3d011682016040523d82523d6000602084013e6111e6565b606091505b506111f38435600161095f565b508335600090815260046020526040902084906112108282612c78565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611245908490612d78565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61128d6119ba565b60005b81811015611280578282828181106112aa576112aa612698565b90506020028101906112bc9190612d8b565b6112cd906040810190602001612dcd565b6113a057600360008484848181106112e7576112e7612698565b90506020028101906112f99190612d8b565b61130790602081019061226b565b67ffffffffffffffff1681526020810191909152604001600090812061132c91612182565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991683838381811061135f5761135f612698565b90506020028101906113719190612d8b565b61137f90602081019061226b565b60405167ffffffffffffffff909116815260200160405180910390a16115f8565b8282828181106113b2576113b2612698565b90506020028101906113c49190612d8b565b6113d2906040810190612705565b905060000361140d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061142557611425612698565b90506020028101906114379190612d8b565b61144590602081019061226b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061147b5761147b612698565b905060200281019061148d9190612d8b565b61149b906040810190612705565b82916114a8919083612a04565b508383838181106114bb576114bb612698565b90506020028101906114cd9190612d8b565b6114db906060810190612705565b159050611526578383838181106114f4576114f4612698565b90506020028101906115069190612d8b565b611514906060810190612705565b6001830191611524919083612a04565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284848481811061155957611559612698565b905060200281019061156b9190612d8b565b61157990602081019061226b565b85858581811061158b5761158b612698565b905060200281019061159d9190612d8b565b6115ab906040810190612705565b8787878181106115bd576115bd612698565b90506020028101906115cf9190612d8b565b6115dd906060810190612705565b6040516115ee959493929190612dea565b60405180910390a1505b600101611290565b333014611639576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611649604082016020830161226b565b6116566040830183612705565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116ad92509050612645565b159050806117035750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116ee9190612e2d565b9081526040519081900360200190205460ff16155b1561128057806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094f9190612d78565b6001611749600583611a3d565b14611783576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094f565b61178e81600061095f565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117d690612645565b80601f016020809104026020016040519081016040528092919081815260200182805461180290612645565b801561184f5780601f106118245761010080835404028352916020019161184f565b820191906000526020600020905b81548152906001019060200180831161183257829003601f168201915b5050505050815260200160038201805461186890612645565b80601f016020809104026020016040519081016040528092919081815260200182805461189490612645565b80156118e15780601f106118b6576101008083540402835291602001916118e1565b820191906000526020600020905b8154815290600101906020018083116118c457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156119645760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161190f565b5050505081525050905061197781611c4c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6119ae6119ba565b6119b781611c54565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094f565b565b6000611a498383611d49565b9392505050565b80471015611aba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b14576040519150601f19603f3d011682016040523d82523d6000602084013e611b19565b606091505b5050905080611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094f565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611280908490611dd3565b6000611c44848484611edf565b949350505050565b6119b76119ba565b3373ffffffffffffffffffffffffffffffffffffffff821603611cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611d6d5750611d6d8484611efc565b611a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161094f565b6000611e35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f089092919063ffffffff16565b8051909150156112805780806020019051810190611e539190612e3f565b611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094f565b60008281526002840160205260408120829055611c448484611f17565b6000611a498383611f23565b6060611c448484600085611f3b565b6000611a498383612054565b60008181526001830160205260408120541515611a49565b606082471015611fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611ff69190612e2d565b60006040518083038185875af1925050503d8060008114612033576040519150601f19603f3d011682016040523d82523d6000602084013e612038565b606091505b5091509150612049878383876120a3565b979650505050505050565b600081815260018301602052604081205461209b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105fa565b5060006105fa565b606083156121395782516000036121325773ffffffffffffffffffffffffffffffffffffffff85163b612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094f565b5081611c44565b611c44838381511561214e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f9190612d78565b50805461218e90612645565b6000825580601f1061219e575050565b601f0160209004906000526020600020908101906119b791905b808211156121cc57600081556001016121b8565b5090565b67ffffffffffffffff811681146119b757600080fd5b6000806000604084860312156121fb57600080fd5b8335612206816121d0565b9250602084013567ffffffffffffffff8082111561222357600080fd5b818601915086601f83011261223757600080fd5b81358181111561224657600080fd5b87602082850101111561225857600080fd5b6020830194508093505050509250925092565b60006020828403121561227d57600080fd5b8135611a49816121d0565b60005b838110156122a357818101518382015260200161228b565b50506000910152565b600081518084526122c4816020860160208601612288565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061230960408301856122ac565b828103602084015261231b81856122ac565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119b757600080fd5b60006020828403121561235857600080fd5b8135611a4981612324565b60006020828403121561237557600080fd5b5035919050565b6000806040838503121561238f57600080fd5b823561239a81612324565b946020939093013593505050565b6000806000606084860312156123bd57600080fd5b83356123c881612324565b925060208401356123d881612324565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a0606086015261242760c08601836122ac565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261246384836122ac565b608089015188820390920160a089015281518082529186019450600092508501905b808310156124c4578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190612485565b50979650505050505050565b600080604083850312156124e357600080fd5b8235915060208301356124f581612324565b809150509250929050565b60008083601f84011261251257600080fd5b50813567ffffffffffffffff81111561252a57600080fd5b6020830191508360208260051b850101111561254557600080fd5b9250929050565b6000806000806040858703121561256257600080fd5b843567ffffffffffffffff8082111561257a57600080fd5b61258688838901612500565b9096509450602087013591508082111561259f57600080fd5b506125ac87828801612500565b95989497509550505050565b6000602082840312156125ca57600080fd5b813567ffffffffffffffff8111156125e157600080fd5b820160a08185031215611a4957600080fd5b6000806020838503121561260657600080fd5b823567ffffffffffffffff81111561261d57600080fd5b61262985828601612500565b90969095509350505050565b8183823760009101908152919050565b600181811c9082168061265957607f821691505b602082108103612692577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126126fb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261273a57600080fd5b83018035915067ffffffffffffffff82111561275557600080fd5b60200191503681900382131561254557600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261279f57600080fd5b830160208101925035905067ffffffffffffffff8111156127bf57600080fd5b80360382131561254557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561286c57813561283a81612324565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612827565b509495945050505050565b602081528135602082015260006020830135612892816121d0565b67ffffffffffffffff80821660408501526128b0604086018661276a565b925060a060608601526128c760c0860184836127ce565b9250506128d7606086018661276a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261290d8583856127ce565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261294657600080fd5b6020928801928301923591508382111561295f57600080fd5b8160061b360383131561297157600080fd5b8685030160a0870152612049848284612817565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611280576000816000526020600020601f850160051c810160208610156129dd5750805b601f850160051c820191505b818110156129fc578281556001016129e9565b505050505050565b67ffffffffffffffff831115612a1c57612a1c612985565b612a3083612a2a8354612645565b836129b4565b6000601f841160018114612a825760008515612a4c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611075565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612ad15786850135825560209485019460019092019101612ab1565b5086821015612b0c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612b7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b8135612b8b81612324565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115612bf157612bf1612985565b805483825580841015612c4357612c0781612b1e565b612c1085612b1e565b6000848152602081209283019291909101905b82821015612c3f57808255806001830155600282019150612c23565b5050505b5060008181526020812083915b858110156129fc57612c628383612b80565b6040929092019160029190910190600101612c50565b81358155600181016020830135612c8e816121d0565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612cce6040860186612705565b93509150612ce0838360028701612a04565b612ced6060860186612705565b93509150612cff838360038701612a04565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612d3657600080fd5b918401918235915080821115612d4b57600080fd5b506020820191508060061b3603821315612d6457600080fd5b612d72818360048601612bd8565b50505050565b602081526000611a4960208301846122ac565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126126fb57600080fd5b80151581146119b757600080fd5b600060208284031215612ddf57600080fd5b8135611a4981612dbf565b67ffffffffffffffff86168152606060208201526000612e0e6060830186886127ce565b8281036040840152612e218185876127ce565b98975050505050505050565b600082516126fb818460208701612288565b600060208284031215612e5157600080fd5b8151611a4981612dbf56fea164736f6c6343000818000a", + 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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b506040516200304e3803806200304e8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e5080620001fe6000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a55780639fe74e2611610074578063cf6730f811610059578063cf6730f81461034a578063e4ca87541461036a578063f2fde38b1461038a57600080fd5b80639fe74e26146102ff578063b0f479a11461031f57600080fd5b806379ba50971461025e5780638462a2b91461027357806385572ffb146102935780638da5cb5b146102b357600080fd5b8063536c6bfa116100e1578063536c6bfa146101d15780635e35359e146101f15780636939cd97146102115780636d62d6331461023e57600080fd5b80630e958d6b1461011e57806335f170ef146101535780634e12498b146101815780635075a9d4146101a357600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e6101393660046121fc565b6103aa565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e366004612281565b6103f5565b60405161014a92919061230c565b34801561018d57600080fd5b506101a161019c36600461235c565b610521565b005b3480156101af57600080fd5b506101c36101be366004612379565b6105ed565b60405190815260200161014a565b3480156101dd57600080fd5b506101a16101ec366004612392565b610600565b3480156101fd57600080fd5b506101a161020c3660046123be565b610664565b34801561021d57600080fd5b5061023161022c366004612379565b6106f9565b60405161014a91906123ff565b34801561024a57600080fd5b506101a16102593660046124e6565b610904565b34801561026a57600080fd5b506101a1610c1e565b34801561027f57600080fd5b506101a161028e366004612562565b610d1b565b34801561029f57600080fd5b506101a16102ae3660046125ce565b61107c565b3480156102bf57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b34801561030b57600080fd5b506101a161031a366004612609565b611285565b34801561032b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102da565b34801561035657600080fd5b506101a16103653660046125ce565b611616565b34801561037657600080fd5b506101a1610385366004612379565b611752565b34801561039657600080fd5b506101a16103a536600461235c565b6119bc565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103d9908590859061264b565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104109061265b565b80601f016020809104026020016040519081016040528092919081815260200182805461043c9061265b565b80156104895780601f1061045e57610100808354040283529160200191610489565b820191906000526020600020905b81548152906001019060200180831161046c57829003601f168201915b50505050509080600101805461049e9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546104ca9061265b565b80156105175780601f106104ec57610100808354040283529160200191610517565b820191906000526020600020905b8154815290600101906020018083116104fa57829003601f168201915b5050505050905082565b6105296119d0565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006105fa600583611a53565b92915050565b6106086119d0565b6106128282611a66565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61066c6119d0565b61068d73ffffffffffffffffffffffffffffffffffffffff84168383611bc0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ec91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107689061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546107949061265b565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b505050505081526020016003820180546107fa9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546108269061265b565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108a1565b505050915250909392505050565b61090c6119d0565b6001610919600584611a53565b14610958576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109688260025b60059190611c4d565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916109b09061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546109dc9061265b565b8015610a295780601f106109fe57610100808354040283529160200191610a29565b820191906000526020600020905b815481529060010190602001808311610a0c57829003601f168201915b50505050508152602001600382018054610a429061265b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e9061265b565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ae9565b5050505081525050905060005b816080015151811015610bcd57610bc58383608001518381518110610b7257610b726126ae565b60200260200101516020015184608001518481518110610b9457610b946126ae565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611bc09092919063ffffffff16565b600101610b4b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d236119d0565b60005b81811015610ec65760036000848484818110610d4457610d446126ae565b9050602002810190610d5691906126dd565b610d64906020810190612281565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d9b57610d9b6126ae565b9050602002810190610dad91906126dd565b610dbb90602081019061271b565b604051610dc992919061264b565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610e1057610e106126ae565b9050602002810190610e2291906126dd565b610e3090602081019061271b565b604051610e3e92919061264b565b6040518091039020838383818110610e5857610e586126ae565b9050602002810190610e6a91906126dd565b610e78906020810190612281565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610eb6911515815260200190565b60405180910390a3600101610d26565b5060005b8381101561107557600160036000878785818110610eea57610eea6126ae565b9050602002810190610efc91906126dd565b610f0a906020810190612281565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f4157610f416126ae565b9050602002810190610f5391906126dd565b610f6190602081019061271b565b604051610f6f92919061264b565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610fbf57610fbf6126ae565b9050602002810190610fd191906126dd565b610fdf90602081019061271b565b604051610fed92919061264b565b6040518091039020858583818110611007576110076126ae565b905060200281019061101991906126dd565b611027906020810190612281565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611065911515815260200190565b60405180910390a3600101610eca565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146110cf576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094f565b6110df6040820160208301612281565b67ffffffffffffffff81166000908152600360205260409020805481906111059061265b565b905060000361114c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061118890869060040161288d565b600060405180830381600087803b1580156111a257600080fd5b505af19250505080156111b3575060015b611253573d8080156111e1576040519150601f19603f3d011682016040523d82523d6000602084013e6111e6565b606091505b506111f38435600161095f565b508335600090815260046020526040902084906112108282612c8e565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611245908490612d8e565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61128d6119d0565b60005b81811015611280578282828181106112aa576112aa6126ae565b90506020028101906112bc9190612da1565b6112cd906040810190602001612de3565b61139957600360008484848181106112e7576112e76126ae565b90506020028101906112f99190612da1565b611307906020810190612281565b67ffffffffffffffff1681526020810191909152604001600090812061132c91612198565b82828281811061133e5761133e6126ae565b90506020028101906113509190612da1565b61135e906020810190612281565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261160e565b8282828181106113ab576113ab6126ae565b90506020028101906113bd9190612da1565b6113cb90604081019061271b565b9050600003611406576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061141e5761141e6126ae565b90506020028101906114309190612da1565b61143e906020810190612281565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611474576114746126ae565b90506020028101906114869190612da1565b61149490604081019061271b565b82916114a1919083612a1a565b508383838181106114b4576114b46126ae565b90506020028101906114c69190612da1565b6114d490606081019061271b565b15905061151f578383838181106114ed576114ed6126ae565b90506020028101906114ff9190612da1565b61150d90606081019061271b565b600183019161151d919083612a1a565b505b838383818110611531576115316126ae565b90506020028101906115439190612da1565b61155190604081019061271b565b60405161155f92919061264b565b6040518091039020848484818110611579576115796126ae565b905060200281019061158b9190612da1565b611599906020810190612281565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106115d6576115d66126ae565b90506020028101906115e89190612da1565b6115f690606081019061271b565b604051611604929190612e00565b60405180910390a3505b600101611290565b33301461164f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61165f6040820160208301612281565b61166c604083018361271b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116c39250905061265b565b159050806117195750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117049190612e14565b9081526040519081900360200190205460ff16155b1561128057806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094f9190612d8e565b600161175f600583611a53565b14611799576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094f565b6117a481600061095f565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117ec9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546118189061265b565b80156118655780601f1061183a57610100808354040283529160200191611865565b820191906000526020600020905b81548152906001019060200180831161184857829003601f168201915b5050505050815260200160038201805461187e9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa9061265b565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561197a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611925565b5050505081525050905061198d81611c62565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6119c46119d0565b6119cd81611c6a565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094f565b565b6000611a5f8383611d5f565b9392505050565b80471015611ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b2a576040519150601f19603f3d011682016040523d82523d6000602084013e611b2f565b606091505b5050905080611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094f565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611280908490611de9565b6000611c5a848484611ef5565b949350505050565b6119cd6119d0565b3373ffffffffffffffffffffffffffffffffffffffff821603611ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611d835750611d838484611f12565b611a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161094f565b6000611e4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f1e9092919063ffffffff16565b8051909150156112805780806020019051810190611e699190612e26565b611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094f565b60008281526002840160205260408120829055611c5a8484611f2d565b6000611a5f8383611f39565b6060611c5a8484600085611f51565b6000611a5f838361206a565b60008181526001830160205260408120541515611a5f565b606082471015611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094f565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161200c9190612e14565b60006040518083038185875af1925050503d8060008114612049576040519150601f19603f3d011682016040523d82523d6000602084013e61204e565b606091505b509150915061205f878383876120b9565b979650505050505050565b60008181526001830160205260408120546120b1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105fa565b5060006105fa565b6060831561214f5782516000036121485773ffffffffffffffffffffffffffffffffffffffff85163b612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094f565b5081611c5a565b611c5a83838151156121645781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f9190612d8e565b5080546121a49061265b565b6000825580601f106121b4575050565b601f0160209004906000526020600020908101906119cd91905b808211156121e257600081556001016121ce565b5090565b67ffffffffffffffff811681146119cd57600080fd5b60008060006040848603121561221157600080fd5b833561221c816121e6565b9250602084013567ffffffffffffffff8082111561223957600080fd5b818601915086601f83011261224d57600080fd5b81358181111561225c57600080fd5b87602082850101111561226e57600080fd5b6020830194508093505050509250925092565b60006020828403121561229357600080fd5b8135611a5f816121e6565b60005b838110156122b95781810151838201526020016122a1565b50506000910152565b600081518084526122da81602086016020860161229e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061231f60408301856122c2565b828103602084015261233181856122c2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119cd57600080fd5b60006020828403121561236e57600080fd5b8135611a5f8161233a565b60006020828403121561238b57600080fd5b5035919050565b600080604083850312156123a557600080fd5b82356123b08161233a565b946020939093013593505050565b6000806000606084860312156123d357600080fd5b83356123de8161233a565b925060208401356123ee8161233a565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a0606086015261243d60c08601836122c2565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261247984836122c2565b608089015188820390920160a089015281518082529186019450600092508501905b808310156124da578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600192909201919083019061249b565b50979650505050505050565b600080604083850312156124f957600080fd5b82359150602083013561250b8161233a565b809150509250929050565b60008083601f84011261252857600080fd5b50813567ffffffffffffffff81111561254057600080fd5b6020830191508360208260051b850101111561255b57600080fd5b9250929050565b6000806000806040858703121561257857600080fd5b843567ffffffffffffffff8082111561259057600080fd5b61259c88838901612516565b909650945060208701359150808211156125b557600080fd5b506125c287828801612516565b95989497509550505050565b6000602082840312156125e057600080fd5b813567ffffffffffffffff8111156125f757600080fd5b820160a08185031215611a5f57600080fd5b6000806020838503121561261c57600080fd5b823567ffffffffffffffff81111561263357600080fd5b61263f85828601612516565b90969095509350505050565b8183823760009101908152919050565b600181811c9082168061266f57607f821691505b6020821081036126a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261271157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261275057600080fd5b83018035915067ffffffffffffffff82111561276b57600080fd5b60200191503681900382131561255b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127b557600080fd5b830160208101925035905067ffffffffffffffff8111156127d557600080fd5b80360382131561255b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156128825781356128508161233a565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161283d565b509495945050505050565b6020815281356020820152600060208301356128a8816121e6565b67ffffffffffffffff80821660408501526128c66040860186612780565b925060a060608601526128dd60c0860184836127e4565b9250506128ed6060860186612780565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526129238583856127e4565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261295c57600080fd5b6020928801928301923591508382111561297557600080fd5b8160061b360383131561298757600080fd5b8685030160a087015261205f84828461282d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611280576000816000526020600020601f850160051c810160208610156129f35750805b601f850160051c820191505b81811015612a12578281556001016129ff565b505050505050565b67ffffffffffffffff831115612a3257612a3261299b565b612a4683612a40835461265b565b836129ca565b6000601f841160018114612a985760008515612a625750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611075565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612ae75786850135825560209485019460019092019101612ac7565b5086821015612b22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b8135612ba18161233a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115612c0757612c0761299b565b805483825580841015612c5957612c1d81612b34565b612c2685612b34565b6000848152602081209283019291909101905b82821015612c5557808255806001830155600282019150612c39565b5050505b5060008181526020812083915b85811015612a1257612c788383612b96565b6040929092019160029190910190600101612c66565b81358155600181016020830135612ca4816121e6565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612ce4604086018661271b565b93509150612cf6838360028701612a1a565b612d03606086018661271b565b93509150612d15838360038701612a1a565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612d4c57600080fd5b918401918235915080821115612d6157600080fd5b506020820191508060061b3603821315612d7a57600080fd5b612d88818360048601612bee565b50505050565b602081526000611a5f60208301846122c2565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261271157600080fd5b80151581146119cd57600080fd5b600060208284031215612df557600080fd5b8135611a5f81612dd5565b602081526000611c5a6020830184866127e4565b6000825161271181846020870161229e565b600060208284031215612e3857600080fd5b8151611a5f81612dd556fea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -815,23 +815,41 @@ func (it *CCIPReceiverChainAddedIterator) Close() error { type CCIPReceiverChainAdded struct { RemoteChainSelector uint64 - Recipient []byte + Recipient common.Hash ExtraArgsBytes []byte Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterChainAdded(opts *bind.FilterOpts) (*CCIPReceiverChainAddedIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPReceiverChainAddedIterator, error) { - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ChainAdded") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } return &CCIPReceiverChainAddedIterator{contract: _CCIPReceiver.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainAdded) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ChainAdded") + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -937,18 +955,28 @@ type CCIPReceiverChainRemoved struct { Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*CCIPReceiverChainRemovedIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPReceiverChainRemovedIterator, error) { - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ChainRemoved") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } return &CCIPReceiverChainRemovedIterator{contract: _CCIPReceiver.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainRemoved) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ChainRemoved") + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -2042,15 +2070,15 @@ type CCIPReceiverInterface interface { ParseCCIPRouterModified(log types.Log) (*CCIPReceiverCCIPRouterModified, error) - FilterChainAdded(opts *bind.FilterOpts) (*CCIPReceiverChainAddedIterator, error) + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPReceiverChainAddedIterator, error) - WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainAdded) (event.Subscription, error) + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) ParseChainAdded(log types.Log) (*CCIPReceiverChainAdded, error) - FilterChainRemoved(opts *bind.FilterOpts) (*CCIPReceiverChainRemovedIterator, error) + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPReceiverChainRemovedIterator, error) - WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainRemoved) (event.Subscription, error) + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverChainRemoved, removeChainSelector []uint64) (event.Subscription, error) ParseChainRemoved(log types.Log) (*CCIPReceiverChainRemoved, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index f6ca5ca628..1795a9bbbe 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -48,8 +48,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\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162002759380380620027598339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61255b80620001fe6000396000f3fe6080604052600436106100cb5760003560e01c80638462a2b911610074578063b0f479a11161004e578063b0f479a11461023d578063effde24014610268578063f2fde38b1461028957600080fd5b80638462a2b9146101b15780638da5cb5b146101d15780639fe74e261461021d57600080fd5b8063536c6bfa116100a5578063536c6bfa1461015c5780635e35359e1461017c57806379ba50971461019c57600080fd5b80630e958d6b146100d757806335f170ef1461010c5780634e12498b1461013a57600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b506100f76100f2366004611c11565b6102a9565b60405190151581526020015b60405180910390f35b34801561011857600080fd5b5061012c610127366004611c64565b6102f4565b604051610103929190611cf4565b34801561014657600080fd5b5061015a610155366004611d4f565b610420565b005b34801561016857600080fd5b5061015a610177366004611d6c565b6104ec565b34801561018857600080fd5b5061015a610197366004611d98565b610550565b3480156101a857600080fd5b5061015a6105e5565b3480156101bd57600080fd5b5061015a6101cc366004611e1e565b6106e7565b3480156101dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610103565b34801561022957600080fd5b5061015a610238366004611e8a565b610a48565b34801561024957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101f8565b61027b610276366004611ecc565b610dc8565b604051908152602001610103565b34801561029557600080fd5b5061015a6102a4366004611d4f565b611326565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102d89085908590611f8d565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061030f90611f9d565b80601f016020809104026020016040519081016040528092919081815260200182805461033b90611f9d565b80156103885780601f1061035d57610100808354040283529160200191610388565b820191906000526020600020905b81548152906001019060200180831161036b57829003601f168201915b50505050509080600101805461039d90611f9d565b80601f01602080910402602001604051908101604052809291908181526020018280546103c990611f9d565b80156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905082565b61042861133a565b73ffffffffffffffffffffffffffffffffffffffff8116610475576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6104f461133a565b6104fe82826113bd565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61055861133a565b61057973ffffffffffffffffffffffffffffffffffffffff84168383611517565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105d891815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6106ef61133a565b60005b81811015610892576003600084848481811061071057610710611ff0565b9050602002810190610722919061201f565b610730906020810190611c64565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061076757610767611ff0565b9050602002810190610779919061201f565b61078790602081019061205d565b604051610795929190611f8d565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106107dc576107dc611ff0565b90506020028101906107ee919061201f565b6107fc90602081019061205d565b60405161080a929190611f8d565b604051809103902083838381811061082457610824611ff0565b9050602002810190610836919061201f565b610844906020810190611c64565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610882911515815260200190565b60405180910390a36001016106f2565b5060005b83811015610a41576001600360008787858181106108b6576108b6611ff0565b90506020028101906108c8919061201f565b6108d6906020810190611c64565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061090d5761090d611ff0565b905060200281019061091f919061201f565b61092d90602081019061205d565b60405161093b929190611f8d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061098b5761098b611ff0565b905060200281019061099d919061201f565b6109ab90602081019061205d565b6040516109b9929190611f8d565b60405180910390208585838181106109d3576109d3611ff0565b90506020028101906109e5919061201f565b6109f3906020810190611c64565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051610a31911515815260200190565b60405180910390a3600101610896565b5050505050565b610a5061133a565b60005b81811015610dc357828282818110610a6d57610a6d611ff0565b9050602002810190610a7f91906120c2565b610a90906040810190602001612104565b610b635760036000848484818110610aaa57610aaa611ff0565b9050602002810190610abc91906120c2565b610aca906020810190611c64565b67ffffffffffffffff16815260208101919091526040016000908120610aef91611b5d565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916838383818110610b2257610b22611ff0565b9050602002810190610b3491906120c2565b610b42906020810190611c64565b60405167ffffffffffffffff909116815260200160405180910390a1610dbb565b828282818110610b7557610b75611ff0565b9050602002810190610b8791906120c2565b610b9590604081019061205d565b9050600003610bd0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110610be857610be8611ff0565b9050602002810190610bfa91906120c2565b610c08906020810190611c64565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110610c3e57610c3e611ff0565b9050602002810190610c5091906120c2565b610c5e90604081019061205d565b8291610c6b9190836121a0565b50838383818110610c7e57610c7e611ff0565b9050602002810190610c9091906120c2565b610c9e90606081019061205d565b159050610ce957838383818110610cb757610cb7611ff0565b9050602002810190610cc991906120c2565b610cd790606081019061205d565b6001830191610ce79190836121a0565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212848484818110610d1c57610d1c611ff0565b9050602002810190610d2e91906120c2565b610d3c906020810190611c64565b858585818110610d4e57610d4e611ff0565b9050602002810190610d6091906120c2565b610d6e90604081019061205d565b878787818110610d8057610d80611ff0565b9050602002810190610d9291906120c2565b610da090606081019061205d565b604051610db1959493929190612303565b60405180910390a1505b600101610a53565b505050565b67ffffffffffffffff8616600090815260036020526040812080548891908190610df190611f9d565b9050600003610e38576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610662565b6040805160a08101825267ffffffffffffffff8b16600090815260036020529182208054829190610e6890611f9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490611f9d565b8015610ee15780601f10610eb657610100808354040283529160200191610ee1565b820191906000526020600020905b815481529060010190602001808311610ec457829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610f7157610f6260408302860136819003810190612346565b81526020019060010190610f45565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610fcc90611f9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff890611f9d565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b5050505050815250905060005b88811015611147576110c133308c8c8581811061107157611071611ff0565b905060400201602001358d8d8681811061108d5761108d611ff0565b6110a39260206040909202019081019150611d4f565b73ffffffffffffffffffffffffffffffffffffffff169291906115eb565b60025461113f9073ffffffffffffffffffffffffffffffffffffffff168b8b848181106110f0576110f0611ff0565b905060400201602001358c8c8581811061110c5761110c611ff0565b6111229260206040909202019081019150611d4f565b73ffffffffffffffffffffffffffffffffffffffff16919061164f565b600101611052565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906111a1908e90869060040161239e565b602060405180830381865afa1580156111be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e291906124b3565b905073ffffffffffffffffffffffffffffffffffffffff8616156112495761122273ffffffffffffffffffffffffffffffffffffffff87163330846115eb565b6002546112499073ffffffffffffffffffffffffffffffffffffffff88811691168361164f565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f99088161561127957600061127b565b825b8d856040518463ffffffff1660e01b815260040161129a92919061239e565b60206040518083038185885af11580156112b8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112dd91906124b3565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161131091815260200190565b60405180910390a1505050509695505050505050565b61132e61133a565b6113378161174d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610662565b565b80471015611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610662565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611481576040519150601f19603f3d011682016040523d82523d6000602084013e611486565b606091505b5050905080610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610662565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610dc39084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611842565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526116499085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611569565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156116c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ea91906124b3565b6116f491906124cc565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506116499085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611569565b3373ffffffffffffffffffffffffffffffffffffffff8216036117cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610662565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006118a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661194e9092919063ffffffff16565b805190915015610dc357808060200190518101906118c2919061250c565b610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610662565b606061195d8484600085611965565b949350505050565b6060824710156119f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610662565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a209190612529565b60006040518083038185875af1925050503d8060008114611a5d576040519150601f19603f3d011682016040523d82523d6000602084013e611a62565b606091505b5091509150611a7387838387611a7e565b979650505050505050565b60608315611b14578251600003611b0d5773ffffffffffffffffffffffffffffffffffffffff85163b611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610662565b508161195d565b61195d8383815115611b295781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610662919061253b565b508054611b6990611f9d565b6000825580601f10611b79575050565b601f01602090049060005260206000209081019061133791905b80821115611ba75760008155600101611b93565b5090565b803567ffffffffffffffff81168114611bc357600080fd5b919050565b60008083601f840112611bda57600080fd5b50813567ffffffffffffffff811115611bf257600080fd5b602083019150836020828501011115611c0a57600080fd5b9250929050565b600080600060408486031215611c2657600080fd5b611c2f84611bab565b9250602084013567ffffffffffffffff811115611c4b57600080fd5b611c5786828701611bc8565b9497909650939450505050565b600060208284031215611c7657600080fd5b611c7f82611bab565b9392505050565b60005b83811015611ca1578181015183820152602001611c89565b50506000910152565b60008151808452611cc2816020860160208601611c86565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611d076040830185611caa565b8281036020840152611d198185611caa565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461133757600080fd5b8035611bc381611d22565b600060208284031215611d6157600080fd5b8135611c7f81611d22565b60008060408385031215611d7f57600080fd5b8235611d8a81611d22565b946020939093013593505050565b600080600060608486031215611dad57600080fd5b8335611db881611d22565b92506020840135611dc881611d22565b929592945050506040919091013590565b60008083601f840112611deb57600080fd5b50813567ffffffffffffffff811115611e0357600080fd5b6020830191508360208260051b8501011115611c0a57600080fd5b60008060008060408587031215611e3457600080fd5b843567ffffffffffffffff80821115611e4c57600080fd5b611e5888838901611dd9565b90965094506020870135915080821115611e7157600080fd5b50611e7e87828801611dd9565b95989497509550505050565b60008060208385031215611e9d57600080fd5b823567ffffffffffffffff811115611eb457600080fd5b611ec085828601611dd9565b90969095509350505050565b60008060008060008060808789031215611ee557600080fd5b611eee87611bab565b9550602087013567ffffffffffffffff80821115611f0b57600080fd5b818901915089601f830112611f1f57600080fd5b813581811115611f2e57600080fd5b8a60208260061b8501011115611f4357600080fd5b602083019750809650506040890135915080821115611f6157600080fd5b50611f6e89828a01611bc8565b9094509250611f81905060608801611d44565b90509295509295509295565b8183823760009101908152919050565b600181811c90821680611fb157607f821691505b602082108103611fea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261205357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261209257600080fd5b83018035915067ffffffffffffffff8211156120ad57600080fd5b602001915036819003821315611c0a57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261205357600080fd5b801515811461133757600080fd5b60006020828403121561211657600080fd5b8135611c7f816120f6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610dc3576000816000526020600020601f850160051c810160208610156121795750805b601f850160051c820191505b8181101561219857828155600101612185565b505050505050565b67ffffffffffffffff8311156121b8576121b8612121565b6121cc836121c68354611f9d565b83612150565b6000601f84116001811461221e57600085156121e85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610a41565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561226d578685013582556020948501946001909201910161224d565b50868210156122a8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff861681526060602082015260006123276060830186886122ba565b828103604084015261233a8185876122ba565b98975050505050505050565b60006040828403121561235857600080fd5b6040516040810181811067ffffffffffffffff8211171561237b5761237b612121565b604052823561238981611d22565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526123cd60e0860182611caa565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526124088383611caa565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612469578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600193909301929086019061242a565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506124a58187611caa565b9a9950505050505050505050565b6000602082840312156124c557600080fd5b5051919050565b80820180821115612506577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561251e57600080fd5b8151611c7f816120f6565b60008251612053818460208701611c86565b602081526000611c7f6020830184611caa56fea164736f6c6343000818000a", + 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\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162002730380380620027308339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61253280620001fe6000396000f3fe6080604052600436106100cb5760003560e01c80638462a2b911610074578063b0f479a11161004e578063b0f479a11461023d578063effde24014610268578063f2fde38b1461028957600080fd5b80638462a2b9146101b15780638da5cb5b146101d15780639fe74e261461021d57600080fd5b8063536c6bfa116100a5578063536c6bfa1461015c5780635e35359e1461017c57806379ba50971461019c57600080fd5b80630e958d6b146100d757806335f170ef1461010c5780634e12498b1461013a57600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b506100f76100f2366004611c27565b6102a9565b60405190151581526020015b60405180910390f35b34801561011857600080fd5b5061012c610127366004611c7a565b6102f4565b604051610103929190611d0a565b34801561014657600080fd5b5061015a610155366004611d65565b610420565b005b34801561016857600080fd5b5061015a610177366004611d82565b6104ec565b34801561018857600080fd5b5061015a610197366004611dae565b610550565b3480156101a857600080fd5b5061015a6105e5565b3480156101bd57600080fd5b5061015a6101cc366004611e34565b6106e7565b3480156101dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610103565b34801561022957600080fd5b5061015a610238366004611ea0565b610a48565b34801561024957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101f8565b61027b610276366004611ee2565b610dde565b604051908152602001610103565b34801561029557600080fd5b5061015a6102a4366004611d65565b61133c565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102d89085908590611fa3565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061030f90611fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461033b90611fb3565b80156103885780601f1061035d57610100808354040283529160200191610388565b820191906000526020600020905b81548152906001019060200180831161036b57829003601f168201915b50505050509080600101805461039d90611fb3565b80601f01602080910402602001604051908101604052809291908181526020018280546103c990611fb3565b80156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905082565b610428611350565b73ffffffffffffffffffffffffffffffffffffffff8116610475576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6104f4611350565b6104fe82826113d3565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610558611350565b61057973ffffffffffffffffffffffffffffffffffffffff8416838361152d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105d891815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6106ef611350565b60005b81811015610892576003600084848481811061071057610710612006565b90506020028101906107229190612035565b610730906020810190611c7a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061076757610767612006565b90506020028101906107799190612035565b610787906020810190612073565b604051610795929190611fa3565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106107dc576107dc612006565b90506020028101906107ee9190612035565b6107fc906020810190612073565b60405161080a929190611fa3565b604051809103902083838381811061082457610824612006565b90506020028101906108369190612035565b610844906020810190611c7a565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610882911515815260200190565b60405180910390a36001016106f2565b5060005b83811015610a41576001600360008787858181106108b6576108b6612006565b90506020028101906108c89190612035565b6108d6906020810190611c7a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061090d5761090d612006565b905060200281019061091f9190612035565b61092d906020810190612073565b60405161093b929190611fa3565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061098b5761098b612006565b905060200281019061099d9190612035565b6109ab906020810190612073565b6040516109b9929190611fa3565b60405180910390208585838181106109d3576109d3612006565b90506020028101906109e59190612035565b6109f3906020810190611c7a565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051610a31911515815260200190565b60405180910390a3600101610896565b5050505050565b610a50611350565b60005b81811015610dd957828282818110610a6d57610a6d612006565b9050602002810190610a7f91906120d8565b610a9090604081019060200161211a565b610b5c5760036000848484818110610aaa57610aaa612006565b9050602002810190610abc91906120d8565b610aca906020810190611c7a565b67ffffffffffffffff16815260208101919091526040016000908120610aef91611b73565b828282818110610b0157610b01612006565b9050602002810190610b1391906120d8565b610b21906020810190611c7a565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2610dd1565b828282818110610b6e57610b6e612006565b9050602002810190610b8091906120d8565b610b8e906040810190612073565b9050600003610bc9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110610be157610be1612006565b9050602002810190610bf391906120d8565b610c01906020810190611c7a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110610c3757610c37612006565b9050602002810190610c4991906120d8565b610c57906040810190612073565b8291610c649190836121b6565b50838383818110610c7757610c77612006565b9050602002810190610c8991906120d8565b610c97906060810190612073565b159050610ce257838383818110610cb057610cb0612006565b9050602002810190610cc291906120d8565b610cd0906060810190612073565b6001830191610ce09190836121b6565b505b838383818110610cf457610cf4612006565b9050602002810190610d0691906120d8565b610d14906040810190612073565b604051610d22929190611fa3565b6040518091039020848484818110610d3c57610d3c612006565b9050602002810190610d4e91906120d8565b610d5c906020810190611c7a565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110610d9957610d99612006565b9050602002810190610dab91906120d8565b610db9906060810190612073565b604051610dc79291906122d0565b60405180910390a3505b600101610a53565b505050565b67ffffffffffffffff8616600090815260036020526040812080548891908190610e0790611fb3565b9050600003610e4e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610662565b6040805160a08101825267ffffffffffffffff8b16600090815260036020529182208054829190610e7e90611fb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa90611fb3565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610f8757610f786040830286013681900381019061231d565b81526020019060010190610f5b565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610fe290611fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461100e90611fb3565b801561105b5780601f106110305761010080835404028352916020019161105b565b820191906000526020600020905b81548152906001019060200180831161103e57829003601f168201915b5050505050815250905060005b8881101561115d576110d733308c8c8581811061108757611087612006565b905060400201602001358d8d868181106110a3576110a3612006565b6110b99260206040909202019081019150611d65565b73ffffffffffffffffffffffffffffffffffffffff16929190611601565b6002546111559073ffffffffffffffffffffffffffffffffffffffff168b8b8481811061110657611106612006565b905060400201602001358c8c8581811061112257611122612006565b6111389260206040909202019081019150611d65565b73ffffffffffffffffffffffffffffffffffffffff169190611665565b600101611068565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906111b7908e908690600401612375565b602060405180830381865afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f8919061248a565b905073ffffffffffffffffffffffffffffffffffffffff86161561125f5761123873ffffffffffffffffffffffffffffffffffffffff8716333084611601565b60025461125f9073ffffffffffffffffffffffffffffffffffffffff888116911683611665565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f99088161561128f576000611291565b825b8d856040518463ffffffff1660e01b81526004016112b0929190612375565b60206040518083038185885af11580156112ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112f3919061248a565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161132691815260200190565b60405180910390a1505050509695505050505050565b611344611350565b61134d81611763565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610662565b565b8047101561143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610662565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611497576040519150601f19603f3d011682016040523d82523d6000602084013e61149c565b606091505b5050905080610dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610662565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610dd99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611858565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261165f9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161157f565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611700919061248a565b61170a91906124a3565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061165f9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161157f565b3373ffffffffffffffffffffffffffffffffffffffff8216036117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610662565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006118ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119649092919063ffffffff16565b805190915015610dd957808060200190518101906118d891906124e3565b610dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610662565b6060611973848460008561197b565b949350505050565b606082471015611a0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610662565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a369190612500565b60006040518083038185875af1925050503d8060008114611a73576040519150601f19603f3d011682016040523d82523d6000602084013e611a78565b606091505b5091509150611a8987838387611a94565b979650505050505050565b60608315611b2a578251600003611b235773ffffffffffffffffffffffffffffffffffffffff85163b611b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610662565b5081611973565b6119738383815115611b3f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106629190612512565b508054611b7f90611fb3565b6000825580601f10611b8f575050565b601f01602090049060005260206000209081019061134d91905b80821115611bbd5760008155600101611ba9565b5090565b803567ffffffffffffffff81168114611bd957600080fd5b919050565b60008083601f840112611bf057600080fd5b50813567ffffffffffffffff811115611c0857600080fd5b602083019150836020828501011115611c2057600080fd5b9250929050565b600080600060408486031215611c3c57600080fd5b611c4584611bc1565b9250602084013567ffffffffffffffff811115611c6157600080fd5b611c6d86828701611bde565b9497909650939450505050565b600060208284031215611c8c57600080fd5b611c9582611bc1565b9392505050565b60005b83811015611cb7578181015183820152602001611c9f565b50506000910152565b60008151808452611cd8816020860160208601611c9c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611d1d6040830185611cc0565b8281036020840152611d2f8185611cc0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461134d57600080fd5b8035611bd981611d38565b600060208284031215611d7757600080fd5b8135611c9581611d38565b60008060408385031215611d9557600080fd5b8235611da081611d38565b946020939093013593505050565b600080600060608486031215611dc357600080fd5b8335611dce81611d38565b92506020840135611dde81611d38565b929592945050506040919091013590565b60008083601f840112611e0157600080fd5b50813567ffffffffffffffff811115611e1957600080fd5b6020830191508360208260051b8501011115611c2057600080fd5b60008060008060408587031215611e4a57600080fd5b843567ffffffffffffffff80821115611e6257600080fd5b611e6e88838901611def565b90965094506020870135915080821115611e8757600080fd5b50611e9487828801611def565b95989497509550505050565b60008060208385031215611eb357600080fd5b823567ffffffffffffffff811115611eca57600080fd5b611ed685828601611def565b90969095509350505050565b60008060008060008060808789031215611efb57600080fd5b611f0487611bc1565b9550602087013567ffffffffffffffff80821115611f2157600080fd5b818901915089601f830112611f3557600080fd5b813581811115611f4457600080fd5b8a60208260061b8501011115611f5957600080fd5b602083019750809650506040890135915080821115611f7757600080fd5b50611f8489828a01611bde565b9094509250611f97905060608801611d5a565b90509295509295509295565b8183823760009101908152919050565b600181811c90821680611fc757607f821691505b602082108103612000577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261206957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126120a857600080fd5b83018035915067ffffffffffffffff8211156120c357600080fd5b602001915036819003821315611c2057600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261206957600080fd5b801515811461134d57600080fd5b60006020828403121561212c57600080fd5b8135611c958161210c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610dd9576000816000526020600020601f850160051c8101602086101561218f5750805b601f850160051c820191505b818110156121ae5782815560010161219b565b505050505050565b67ffffffffffffffff8311156121ce576121ce612137565b6121e2836121dc8354611fb3565b83612166565b6000601f84116001811461223457600085156121fe5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610a41565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156122835786850135825560209485019460019092019101612263565b50868210156122be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006040828403121561232f57600080fd5b6040516040810181811067ffffffffffffffff8211171561235257612352612137565b604052823561236081611d38565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526123a460e0860182611cc0565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526123df8383611cc0565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612440578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612401565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061247c8187611cc0565b9a9950505050505050505050565b60006020828403121561249c57600080fd5b5051919050565b808201808211156124dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156124f557600080fd5b8151611c958161210c565b60008251612069818460208701611c9c565b602081526000611c956020830184611cc056fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -727,23 +727,41 @@ func (it *CCIPSenderChainAddedIterator) Close() error { type CCIPSenderChainAdded struct { RemoteChainSelector uint64 - Recipient []byte + Recipient common.Hash ExtraArgsBytes []byte Raw types.Log } -func (_CCIPSender *CCIPSenderFilterer) FilterChainAdded(opts *bind.FilterOpts) (*CCIPSenderChainAddedIterator, error) { +func (_CCIPSender *CCIPSenderFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPSenderChainAddedIterator, error) { - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ChainAdded") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } return &CCIPSenderChainAddedIterator{contract: _CCIPSender.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_CCIPSender *CCIPSenderFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainAdded) (event.Subscription, error) { +func (_CCIPSender *CCIPSenderFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ChainAdded") + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -849,18 +867,28 @@ type CCIPSenderChainRemoved struct { Raw types.Log } -func (_CCIPSender *CCIPSenderFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*CCIPSenderChainRemovedIterator, error) { +func (_CCIPSender *CCIPSenderFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPSenderChainRemovedIterator, error) { - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ChainRemoved") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } return &CCIPSenderChainRemovedIterator{contract: _CCIPSender.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_CCIPSender *CCIPSenderFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainRemoved) (event.Subscription, error) { +func (_CCIPSender *CCIPSenderFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ChainRemoved") + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -1656,15 +1684,15 @@ type CCIPSenderInterface interface { ParseCCIPRouterModified(log types.Log) (*CCIPSenderCCIPRouterModified, error) - FilterChainAdded(opts *bind.FilterOpts) (*CCIPSenderChainAddedIterator, error) + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPSenderChainAddedIterator, error) - WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainAdded) (event.Subscription, error) + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) ParseChainAdded(log types.Log) (*CCIPSenderChainAdded, error) - FilterChainRemoved(opts *bind.FilterOpts) (*CCIPSenderChainRemovedIterator, error) + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPSenderChainRemovedIterator, error) - WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainRemoved) (event.Subscription, error) + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderChainRemoved, removeChainSelector []uint64) (event.Subscription, error) ParseChainRemoved(log types.Log) (*CCIPSenderChainRemoved, 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 7fbdefc002..b41bd441ad 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004c9b38038062004c9b833981016040819052620000349162000571565b81818181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200014d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b03821683600019620001f8565b505050505050505062000696565b336001600160a01b03821603620001a75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002709190620005b0565b6200027c9190620005ca565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d891869190620002de16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032d906001600160a01b038516908490620003b4565b805190915015620003af57808060200190518101906200034e9190620005f2565b620003af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003c58484600085620003cd565b949350505050565b606082471015620004305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200044e919062000643565b60006040518083038185875af1925050503d80600081146200048d576040519150601f19603f3d011682016040523d82523d6000602084013e62000492565b606091505b509092509050620004a687838387620004b1565b979650505050505050565b60608315620005255782516000036200051d576001600160a01b0385163b6200051d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003c5565b620003c583838151156200053c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000661565b6001600160a01b03811681146200056e57600080fd5b50565b600080604083850312156200058557600080fd5b8251620005928162000558565b6020840151909250620005a58162000558565b809150509250929050565b600060208284031215620005c357600080fd5b5051919050565b80820180821115620005ec57634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060557600080fd5b815180151581146200061657600080fd5b9392505050565b60005b838110156200063a57818101518382015260200162000620565b50506000910152565b60008251620006578184602087016200061d565b9190910192915050565b6020815260008251806020840152620006828160408501602087016200061d565b601f01601f19169190910160400192915050565b6145f580620006a66000396000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b187bd2611610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063b187bd26146105b9578063b5a11011146105f1578063bee518a414610611578063cf6730f81461063a57600080fd5b80638da5cb5b116100d15780638da5cb5b146105235780639d2aede51461054e5780639fe74e261461056e578063b0f479a11461058e57600080fd5b80636fef519e1461048557806379ba5097146104ce5780638462a2b9146104e357806385572ffb1461050357600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f85780635e35359e146104185780636939cd97146104385780636d62d6331461046557600080fd5b80632b6e5d631461032457806335f170ef1461037c5780634e12498b146103aa5780635075a9d4146103ca57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102186102033660046134ce565b60096020526000908152604090205460ff1681565b60405161022591906134e7565b60405180910390f35b34801561023a57600080fd5b5061024e61024936600461353e565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e6102793660046135e5565b610725565b005b34801561028c57600080fd5b5061027e61029b366004613610565b610899565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b604051610225919061369b565b3480156102fb57600080fd5b5061027e61030a3660046136ae565b6108f3565b34801561031b57600080fd5b5061027e610936565b34801561033057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046136ae565b610972565b6040516102259291906136cb565b3480156103b657600080fd5b5061027e6103c53660046135e5565b610a9e565b3480156103d657600080fd5b506103ea6103e53660046134ce565b610b6a565b604051908152602001610225565b34801561040457600080fd5b5061027e6104133660046136f9565b610b7d565b34801561042457600080fd5b5061027e610433366004613725565b610be1565b34801561044457600080fd5b506104586104533660046134ce565b610c76565b60405161022591906137c3565b34801561047157600080fd5b5061027e610480366004613857565b610e81565b34801561049157600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104da57600080fd5b5061027e61119b565b3480156104ef57600080fd5b5061027e6104fe3660046138d3565b611298565b34801561050f57600080fd5b5061027e61051e36600461393f565b6115f9565b34801561052f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055a57600080fd5b5061027e6105693660046135e5565b611906565b34801561057a57600080fd5b5061027e61058936600461397a565b6119c1565b34801561059a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610357565b3480156105c557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105fd57600080fd5b5061027e61060c3660046139bc565b611d41565b34801561061d57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561064657600080fd5b5061027e61065536600461393f565b611eb1565b34801561066657600080fd5b5061027e6106753660046134ce565b6120ce565b6103ea610688366004613b1f565b612338565b34801561069957600080fd5b5061027e6106a83660046135e5565b61286e565b3480156106b957600080fd5b506008546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613c2c565b9081526040519081900360200190205460ff1690509392505050565b61072d612882565b60085473ffffffffffffffffffffffffffffffffffffffff161561078e5761078e61076d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612903565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561083b5761083b6107fb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b03565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108a1612882565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6108fb612882565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61093e612882565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109706001612c07565b565b60036020526000908152604090208054819061098d90613c3c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990613c3c565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505090806001018054610a1b90613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613c3c565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905082565b610aa6612882565b73ffffffffffffffffffffffffffffffffffffffff8116610af3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610b77600583612d14565b92915050565b610b85612882565b610b8f8282612d27565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610be9612882565b610c0a73ffffffffffffffffffffffffffffffffffffffff84168383612e81565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610c6991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ce590613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190613c3c565b8015610d5e5780601f10610d3357610100808354040283529160200191610d5e565b820191906000526020600020905b815481529060010190602001808311610d4157829003601f168201915b50505050508152602001600382018054610d7790613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613c3c565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e1e565b505050915250909392505050565b610e89612882565b6001610e96600584612d14565b14610ed5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ee58260025b60059190612ed7565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f2d90613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990613c3c565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b50505050508152602001600382018054610fbf90613c3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb90613c3c565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110bb5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611066565b5050505081525050905060005b81608001515181101561114a5761114283836080015183815181106110ef576110ef613c8f565b6020026020010151602001518460800151848151811061111157611111613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e819092919063ffffffff16565b6001016110c8565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ecc565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112a0612882565b60005b8181101561144357600360008484848181106112c1576112c1613c8f565b90506020028101906112d39190613cbe565b6112e19060208101906136ae565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061131857611318613c8f565b905060200281019061132a9190613cbe565b611338906020810190613cfc565b604051611346929190613c2c565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061138d5761138d613c8f565b905060200281019061139f9190613cbe565b6113ad906020810190613cfc565b6040516113bb929190613c2c565b60405180910390208383838181106113d5576113d5613c8f565b90506020028101906113e79190613cbe565b6113f59060208101906136ae565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611433911515815260200190565b60405180910390a36001016112a3565b5060005b838110156115f25760016003600087878581811061146757611467613c8f565b90506020028101906114799190613cbe565b6114879060208101906136ae565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106114be576114be613c8f565b90506020028101906114d09190613cbe565b6114de906020810190613cfc565b6040516114ec929190613c2c565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061153c5761153c613c8f565b905060200281019061154e9190613cbe565b61155c906020810190613cfc565b60405161156a929190613c2c565b604051809103902085858381811061158457611584613c8f565b90506020028101906115969190613cbe565b6115a49060208101906136ae565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516115e2911515815260200190565b60405180910390a3600101611447565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461164c576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ecc565b61165c60408201602083016136ae565b6116696040830183613cfc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116c092509050613c3c565b159050806117165750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117019190613d61565b9081526040519081900360200190205460ff16155b1561174f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc919061369b565b61175f60408401602085016136ae565b67ffffffffffffffff811660009081526003602052604090208054819061178590613c3c565b90506000036117cc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611808908890600401613e75565b600060405180830381600087803b15801561182257600080fd5b505af1925050508015611833575060015b6118d3573d808015611861576040519150601f19603f3d011682016040523d82523d6000602084013e611866565b606091505b5061187386356001610edc565b508535600090815260046020526040902086906118908282614247565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906118c590849061369b565b60405180910390a2506115f2565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61190e612882565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906119bd9082614341565b5050565b6119c9612882565b60005b81811015611d3c578282828181106119e6576119e6613c8f565b90506020028101906119f8919061445b565b611a09906040810190602001613610565b611adc5760036000848484818110611a2357611a23613c8f565b9050602002810190611a35919061445b565b611a439060208101906136ae565b67ffffffffffffffff16815260208101919091526040016000908120611a6891613480565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916838383818110611a9b57611a9b613c8f565b9050602002810190611aad919061445b565b611abb9060208101906136ae565b60405167ffffffffffffffff909116815260200160405180910390a1611d34565b828282818110611aee57611aee613c8f565b9050602002810190611b00919061445b565b611b0e906040810190613cfc565b9050600003611b49576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611b6157611b61613c8f565b9050602002810190611b73919061445b565b611b819060208101906136ae565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611bb757611bb7613c8f565b9050602002810190611bc9919061445b565b611bd7906040810190613cfc565b8291611be4919083613fcb565b50838383818110611bf757611bf7613c8f565b9050602002810190611c09919061445b565b611c17906060810190613cfc565b159050611c6257838383818110611c3057611c30613c8f565b9050602002810190611c42919061445b565b611c50906060810190613cfc565b6001830191611c60919083613fcb565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212848484818110611c9557611c95613c8f565b9050602002810190611ca7919061445b565b611cb59060208101906136ae565b858585818110611cc757611cc7613c8f565b9050602002810190611cd9919061445b565b611ce7906040810190613cfc565b878787818110611cf957611cf9613c8f565b9050602002810190611d0b919061445b565b611d19906060810190613cfc565b604051611d2a95949392919061448f565b60405180910390a1505b6001016119cc565b505050565b611d49612882565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611e0491613d61565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611d3c9082614341565b333014611eea576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611efa60408201602083016136ae565b611f076040830183613cfc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611f5e92509050613c3c565b15905080611fb45750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611f9f9190613d61565b9081526040519081900360200190205460ff16155b15611fed57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc919061369b565b611ffd60408401602085016136ae565b67ffffffffffffffff811660009081526003602052604090208054819061202390613c3c565b905060000361206a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b60006120796060870187613cfc565b81019061208691906134ce565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff166120c6576120c66120c18260016144d2565b612c07565b505050505050565b60016120db600583612d14565b14612115576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ecc565b612120816000610edc565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161216890613c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461219490613c3c565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505081526020016003820180546121fa90613c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461222690613c3c565b80156122735780601f1061224857610100808354040283529160200191612273565b820191906000526020600020905b81548152906001019060200180831161225657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156122f65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016122a1565b5050505081525050905061230981612eec565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061236190613c3c565b90506000036123a8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906123d890613c3c565b80601f016020809104026020016040519081016040528092919081815260200182805461240490613c3c565b80156124515780601f1061242657610100808354040283529160200191612451565b820191906000526020600020905b81548152906001019060200180831161243457829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916124b290613c3c565b80601f01602080910402602001604051908101604052809291908181526020018280546124de90613c3c565b801561252b5780601f106125005761010080835404028352916020019161252b565b820191906000526020600020905b81548152906001019060200180831161250e57829003601f168201915b5050505050815250905060005b8651811015612688576125a8333089848151811061255857612558613c8f565b6020026020010151602001518a858151811061257657612576613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ef4909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106125d8576125d8613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126805760025487516126809173ffffffffffffffffffffffffffffffffffffffff169089908490811061263157612631613c8f565b60200260200101516020015189848151811061264f5761264f613c8f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129039092919063ffffffff16565b600101612538565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906126e2908b9086906004016144e5565b602060405180830381865afa1580156126ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272391906145b2565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612769576008546127699073ffffffffffffffffffffffffffffffffffffffff16333084612ef4565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561279b57600061279d565b825b8a856040518463ffffffff1660e01b81526004016127bc9291906144e5565b60206040518083038185885af11580156127da573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127ff91906145b2565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612876612882565b61287f81612f52565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ecc565b8015806129a357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a191906145b2565b155b612a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d3c9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613047565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9e91906145b2565b612ba891906144d2565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612c019085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a81565b50505050565b80600116600103612c4a576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612c7e565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b600081604051602001612c9391815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a54600080855260208501909352909350611d3c9267ffffffffffffffff90911691612d0d565b6040805180820190915260008082526020820152815260200190600190039081612ce65790505b5083612338565b6000612d208383613153565b9392505050565b80471015612d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ecc565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612deb576040519150601f19603f3d011682016040523d82523d6000602084013e612df0565b606091505b5050905080611d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d3c9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a81565b6000612ee48484846131dd565b949350505050565b61287f612882565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612c019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a81565b3373ffffffffffffffffffffffffffffffffffffffff821603612fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ecc565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006130a9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131fa9092919063ffffffff16565b805190915015611d3c57808060200190518101906130c791906145cb565b611d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecc565b60008181526002830160205260408120548015158061317757506131778484613209565b612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ecc565b60008281526002840160205260408120829055612ee48484613215565b6060612ee48484600085613221565b6000612d20838361333a565b6000612d208383613352565b6060824710156132b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ecc565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132dc9190613d61565b60006040518083038185875af1925050503d8060008114613319576040519150601f19603f3d011682016040523d82523d6000602084013e61331e565b606091505b509150915061332f878383876133a1565b979650505050505050565b60008181526001830160205260408120541515612d20565b600081815260018301602052604081205461339957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b77565b506000610b77565b606083156134375782516000036134305773ffffffffffffffffffffffffffffffffffffffff85163b613430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecc565b5081612ee4565b612ee4838381511561344c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc919061369b565b50805461348c90613c3c565b6000825580601f1061349c575050565b601f01602090049060005260206000209081019061287f91905b808211156134ca57600081556001016134b6565b5090565b6000602082840312156134e057600080fd5b5035919050565b6020810160038310613522577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461287f57600080fd5b60008060006040848603121561355357600080fd5b833561355e81613528565b9250602084013567ffffffffffffffff8082111561357b57600080fd5b818601915086601f83011261358f57600080fd5b81358181111561359e57600080fd5b8760208285010111156135b057600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff8116811461287f57600080fd5b6000602082840312156135f757600080fd5b8135612d20816135c3565b801515811461287f57600080fd5b60006020828403121561362257600080fd5b8135612d2081613602565b60005b83811015613648578181015183820152602001613630565b50506000910152565b6000815180845261366981602086016020860161362d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d206020830184613651565b6000602082840312156136c057600080fd5b8135612d2081613528565b6040815260006136de6040830185613651565b82810360208401526136f08185613651565b95945050505050565b6000806040838503121561370c57600080fd5b8235613717816135c3565b946020939093013593505050565b60008060006060848603121561373a57600080fd5b8335613745816135c3565b92506020840135613755816135c3565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156137b8578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161377b565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526137fd60c0840182613651565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526138398383613651565b925060808601519150808584030160a0860152506136f08282613766565b6000806040838503121561386a57600080fd5b82359150602083013561387c816135c3565b809150509250929050565b60008083601f84011261389957600080fd5b50813567ffffffffffffffff8111156138b157600080fd5b6020830191508360208260051b85010111156138cc57600080fd5b9250929050565b600080600080604085870312156138e957600080fd5b843567ffffffffffffffff8082111561390157600080fd5b61390d88838901613887565b9096509450602087013591508082111561392657600080fd5b5061393387828801613887565b95989497509550505050565b60006020828403121561395157600080fd5b813567ffffffffffffffff81111561396857600080fd5b820160a08185031215612d2057600080fd5b6000806020838503121561398d57600080fd5b823567ffffffffffffffff8111156139a457600080fd5b6139b085828601613887565b90969095509350505050565b600080604083850312156139cf57600080fd5b82356139da81613528565b9150602083013561387c816135c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a3c57613a3c6139ea565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a8957613a896139ea565b604052919050565b600082601f830112613aa257600080fd5b813567ffffffffffffffff811115613abc57613abc6139ea565b613aed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a42565b818152846020838601011115613b0257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b3457600080fd5b8335613b3f81613528565b925060208481013567ffffffffffffffff80821115613b5d57600080fd5b818701915087601f830112613b7157600080fd5b813581811115613b8357613b836139ea565b613b91848260051b01613a42565b81815260069190911b8301840190848101908a831115613bb057600080fd5b938501935b82851015613bfc576040858c031215613bce5760008081fd5b613bd6613a19565b8535613be1816135c3565b81528587013587820152825260409094019390850190613bb5565b965050506040870135925080831115613c1457600080fd5b5050613c2286828701613a91565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613c5057607f821691505b602082108103613c89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613cf257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d3157600080fd5b83018035915067ffffffffffffffff821115613d4c57600080fd5b6020019150368190038213156138cc57600080fd5b60008251613cf281846020870161362d565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613da857600080fd5b830160208101925035905067ffffffffffffffff811115613dc857600080fd5b8036038213156138cc57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156137b8578135613e43816135c3565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613e30565b602081528135602082015260006020830135613e9081613528565b67ffffffffffffffff8082166040850152613eae6040860186613d73565b925060a06060860152613ec560c086018483613dd7565b925050613ed56060860186613d73565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f0b858385613dd7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613f4457600080fd5b60209288019283019235915083821115613f5d57600080fd5b8160061b3603831315613f6f57600080fd5b8685030160a087015261332f848284613e20565b601f821115611d3c576000816000526020600020601f850160051c81016020861015613fac5750805b601f850160051c820191505b818110156120c657828155600101613fb8565b67ffffffffffffffff831115613fe357613fe36139ea565b613ff783613ff18354613c3c565b83613f83565b6000601f84116001811461404957600085156140135750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115f2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140985786850135825560209485019460019092019101614078565b50868210156140d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561411f816135c3565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115614185576141856139ea565b8054838255808410156142125760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146141c6576141c66140e5565b80861686146141d7576141d76140e5565b5060008360005260206000208360011b81018760011b820191505b8082101561420d5782825582848301556002820191506141f2565b505050505b5060008181526020812083915b858110156120c6576142318383614114565b604092909201916002919091019060010161421f565b8135815560018101602083013561425d81613528565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561429d6040860186613cfc565b935091506142af838360028701613fcb565b6142bc6060860186613cfc565b935091506142ce838360038701613fcb565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261430557600080fd5b91840191823591508082111561431a57600080fd5b506020820191508060061b360382131561433357600080fd5b612c0181836004860161416c565b815167ffffffffffffffff81111561435b5761435b6139ea565b61436f816143698454613c3c565b84613f83565b602080601f8311600181146143c2576000841561438c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556120c6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561440f578886015182559484019460019091019084016143f0565b508582101561444b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613cf257600080fd5b67ffffffffffffffff861681526060602082015260006144b3606083018688613dd7565b82810360408401526144c6818587613dd7565b98975050505050505050565b80820180821115610b7757610b776140e5565b67ffffffffffffffff83168152604060208201526000825160a0604084015261451160e0840182613651565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261454d8383613651565b9250604086015191508085840301608086015261456a8383613766565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145a88282613651565b9695505050505050565b6000602082840312156145c457600080fd5b5051919050565b6000602082840312156145dd57600080fd5b8151612d208161360256fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004c8238038062004c82833981016040819052620000349162000571565b81818181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200014d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b03821683600019620001f8565b505050505050505062000696565b336001600160a01b03821603620001a75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002709190620005b0565b6200027c9190620005ca565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d891869190620002de16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032d906001600160a01b038516908490620003b4565b805190915015620003af57808060200190518101906200034e9190620005f2565b620003af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003c58484600085620003cd565b949350505050565b606082471015620004305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200044e919062000643565b60006040518083038185875af1925050503d80600081146200048d576040519150601f19603f3d011682016040523d82523d6000602084013e62000492565b606091505b509092509050620004a687838387620004b1565b979650505050505050565b60608315620005255782516000036200051d576001600160a01b0385163b6200051d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003c5565b620003c583838151156200053c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000661565b6001600160a01b03811681146200056e57600080fd5b50565b600080604083850312156200058557600080fd5b8251620005928162000558565b6020840151909250620005a58162000558565b809150509250929050565b600060208284031215620005c357600080fd5b5051919050565b80820180821115620005ec57634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060557600080fd5b815180151581146200061657600080fd5b9392505050565b60005b838110156200063a57818101518382015260200162000620565b50506000910152565b60008251620006578184602087016200061d565b9190910192915050565b6020815260008251806020840152620006828160408501602087016200061d565b601f01601f19169190910160400192915050565b6145dc80620006a66000396000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b187bd2611610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063b187bd26146105b9578063b5a11011146105f1578063bee518a414610611578063cf6730f81461063a57600080fd5b80638da5cb5b116100d15780638da5cb5b146105235780639d2aede51461054e5780639fe74e261461056e578063b0f479a11461058e57600080fd5b80636fef519e1461048557806379ba5097146104ce5780638462a2b9146104e357806385572ffb1461050357600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f85780635e35359e146104185780636939cd97146104385780636d62d6331461046557600080fd5b80632b6e5d631461032457806335f170ef1461037c5780634e12498b146103aa5780635075a9d4146103ca57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102186102033660046134e4565b60096020526000908152604090205460ff1681565b60405161022591906134fd565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613554565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e6102793660046135fb565b610725565b005b34801561028c57600080fd5b5061027e61029b366004613626565b610899565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906136b1565b3480156102fb57600080fd5b5061027e61030a3660046136c4565b6108f3565b34801561031b57600080fd5b5061027e610936565b34801561033057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046136c4565b610972565b6040516102259291906136e1565b3480156103b657600080fd5b5061027e6103c53660046135fb565b610a9e565b3480156103d657600080fd5b506103ea6103e53660046134e4565b610b6a565b604051908152602001610225565b34801561040457600080fd5b5061027e61041336600461370f565b610b7d565b34801561042457600080fd5b5061027e61043336600461373b565b610be1565b34801561044457600080fd5b506104586104533660046134e4565b610c76565b60405161022591906137d9565b34801561047157600080fd5b5061027e61048036600461386d565b610e81565b34801561049157600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104da57600080fd5b5061027e61119b565b3480156104ef57600080fd5b5061027e6104fe3660046138e9565b611298565b34801561050f57600080fd5b5061027e61051e366004613955565b6115f9565b34801561052f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055a57600080fd5b5061027e6105693660046135fb565b611906565b34801561057a57600080fd5b5061027e610589366004613990565b6119c1565b34801561059a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610357565b3480156105c557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105fd57600080fd5b5061027e61060c3660046139d2565b611d57565b34801561061d57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561064657600080fd5b5061027e610655366004613955565b611ec7565b34801561066657600080fd5b5061027e6106753660046134e4565b6120e4565b6103ea610688366004613b35565b61234e565b34801561069957600080fd5b5061027e6106a83660046135fb565b612884565b3480156106b957600080fd5b506008546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613c42565b9081526040519081900360200190205460ff1690509392505050565b61072d612898565b60085473ffffffffffffffffffffffffffffffffffffffff161561078e5761078e61076d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612919565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561083b5761083b6107fb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b19565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108a1612898565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6108fb612898565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61093e612898565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109706001612c1d565b565b60036020526000908152604090208054819061098d90613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990613c52565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505090806001018054610a1b90613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613c52565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905082565b610aa6612898565b73ffffffffffffffffffffffffffffffffffffffff8116610af3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610b77600583612d2a565b92915050565b610b85612898565b610b8f8282612d3d565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610be9612898565b610c0a73ffffffffffffffffffffffffffffffffffffffff84168383612e97565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610c6991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ce590613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190613c52565b8015610d5e5780601f10610d3357610100808354040283529160200191610d5e565b820191906000526020600020905b815481529060010190602001808311610d4157829003601f168201915b50505050508152602001600382018054610d7790613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613c52565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e1e565b505050915250909392505050565b610e89612898565b6001610e96600584612d2a565b14610ed5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ee58260025b60059190612eed565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f2d90613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990613c52565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b50505050508152602001600382018054610fbf90613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb90613c52565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110bb5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611066565b5050505081525050905060005b81608001515181101561114a5761114283836080015183815181106110ef576110ef613ca5565b6020026020010151602001518460800151848151811061111157611111613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e979092919063ffffffff16565b6001016110c8565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ecc565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112a0612898565b60005b8181101561144357600360008484848181106112c1576112c1613ca5565b90506020028101906112d39190613cd4565b6112e19060208101906136c4565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061131857611318613ca5565b905060200281019061132a9190613cd4565b611338906020810190613d12565b604051611346929190613c42565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061138d5761138d613ca5565b905060200281019061139f9190613cd4565b6113ad906020810190613d12565b6040516113bb929190613c42565b60405180910390208383838181106113d5576113d5613ca5565b90506020028101906113e79190613cd4565b6113f59060208101906136c4565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611433911515815260200190565b60405180910390a36001016112a3565b5060005b838110156115f25760016003600087878581811061146757611467613ca5565b90506020028101906114799190613cd4565b6114879060208101906136c4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106114be576114be613ca5565b90506020028101906114d09190613cd4565b6114de906020810190613d12565b6040516114ec929190613c42565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061153c5761153c613ca5565b905060200281019061154e9190613cd4565b61155c906020810190613d12565b60405161156a929190613c42565b604051809103902085858381811061158457611584613ca5565b90506020028101906115969190613cd4565b6115a49060208101906136c4565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516115e2911515815260200190565b60405180910390a3600101611447565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461164c576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ecc565b61165c60408201602083016136c4565b6116696040830183613d12565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116c092509050613c52565b159050806117165750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117019190613d77565b9081526040519081900360200190205460ff16155b1561174f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc91906136b1565b61175f60408401602085016136c4565b67ffffffffffffffff811660009081526003602052604090208054819061178590613c52565b90506000036117cc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611808908890600401613e8b565b600060405180830381600087803b15801561182257600080fd5b505af1925050508015611833575060015b6118d3573d808015611861576040519150601f19603f3d011682016040523d82523d6000602084013e611866565b606091505b5061187386356001610edc565b50853560009081526004602052604090208690611890828261425d565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906118c59084906136b1565b60405180910390a2506115f2565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61190e612898565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906119bd9082614357565b5050565b6119c9612898565b60005b81811015611d52578282828181106119e6576119e6613ca5565b90506020028101906119f89190614471565b611a09906040810190602001613626565b611ad55760036000848484818110611a2357611a23613ca5565b9050602002810190611a359190614471565b611a439060208101906136c4565b67ffffffffffffffff16815260208101919091526040016000908120611a6891613496565b828282818110611a7a57611a7a613ca5565b9050602002810190611a8c9190614471565b611a9a9060208101906136c4565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611d4a565b828282818110611ae757611ae7613ca5565b9050602002810190611af99190614471565b611b07906040810190613d12565b9050600003611b42576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611b5a57611b5a613ca5565b9050602002810190611b6c9190614471565b611b7a9060208101906136c4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611bb057611bb0613ca5565b9050602002810190611bc29190614471565b611bd0906040810190613d12565b8291611bdd919083613fe1565b50838383818110611bf057611bf0613ca5565b9050602002810190611c029190614471565b611c10906060810190613d12565b159050611c5b57838383818110611c2957611c29613ca5565b9050602002810190611c3b9190614471565b611c49906060810190613d12565b6001830191611c59919083613fe1565b505b838383818110611c6d57611c6d613ca5565b9050602002810190611c7f9190614471565b611c8d906040810190613d12565b604051611c9b929190613c42565b6040518091039020848484818110611cb557611cb5613ca5565b9050602002810190611cc79190614471565b611cd59060208101906136c4565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611d1257611d12613ca5565b9050602002810190611d249190614471565b611d32906060810190613d12565b604051611d409291906144a5565b60405180910390a3505b6001016119cc565b505050565b611d5f612898565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611e1a91613d77565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611d529082614357565b333014611f00576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f1060408201602083016136c4565b611f1d6040830183613d12565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611f7492509050613c52565b15905080611fca5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611fb59190613d77565b9081526040519081900360200190205460ff16155b1561200357806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc91906136b1565b61201360408401602085016136c4565b67ffffffffffffffff811660009081526003602052604090208054819061203990613c52565b9050600003612080576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b600061208f6060870187613d12565b81019061209c91906134e4565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff166120dc576120dc6120d78260016144b9565b612c1d565b505050505050565b60016120f1600583612d2a565b1461212b576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ecc565b612136816000610edc565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161217e90613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546121aa90613c52565b80156121f75780601f106121cc576101008083540402835291602001916121f7565b820191906000526020600020905b8154815290600101906020018083116121da57829003601f168201915b5050505050815260200160038201805461221090613c52565b80601f016020809104026020016040519081016040528092919081815260200182805461223c90613c52565b80156122895780601f1061225e57610100808354040283529160200191612289565b820191906000526020600020905b81548152906001019060200180831161226c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561230c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016122b7565b5050505081525050905061231f81612f02565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061237790613c52565b90506000036123be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906123ee90613c52565b80601f016020809104026020016040519081016040528092919081815260200182805461241a90613c52565b80156124675780601f1061243c57610100808354040283529160200191612467565b820191906000526020600020905b81548152906001019060200180831161244a57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916124c890613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546124f490613c52565b80156125415780601f1061251657610100808354040283529160200191612541565b820191906000526020600020905b81548152906001019060200180831161252457829003601f168201915b5050505050815250905060005b865181101561269e576125be333089848151811061256e5761256e613ca5565b6020026020010151602001518a858151811061258c5761258c613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612f0a909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106125ee576125ee613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126965760025487516126969173ffffffffffffffffffffffffffffffffffffffff169089908490811061264757612647613ca5565b60200260200101516020015189848151811061266557612665613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129199092919063ffffffff16565b60010161254e565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906126f8908b9086906004016144cc565b602060405180830381865afa158015612715573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127399190614599565b60085490915073ffffffffffffffffffffffffffffffffffffffff161561277f5760085461277f9073ffffffffffffffffffffffffffffffffffffffff16333084612f0a565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156127b15760006127b3565b825b8a856040518463ffffffff1660e01b81526004016127d29291906144cc565b60206040518083038185885af11580156127f0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128159190614599565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61288c612898565b61289581612f68565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ecc565b8015806129b957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b79190614599565b155b612a45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d529084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261305d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb49190614599565b612bbe91906144b9565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612c179085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a97565b50505050565b80600116600103612c60576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612c94565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b600081604051602001612ca991815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a54600080855260208501909352909350611d529267ffffffffffffffff90911691612d23565b6040805180820190915260008082526020820152815260200190600190039081612cfc5790505b508361234e565b6000612d368383613169565b9392505050565b80471015612da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ecc565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e01576040519150601f19603f3d011682016040523d82523d6000602084013e612e06565b606091505b5050905080611d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d529084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a97565b6000612efa8484846131f3565b949350505050565b612895612898565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612c179085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a97565b3373ffffffffffffffffffffffffffffffffffffffff821603612fe7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ecc565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006130bf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132109092919063ffffffff16565b805190915015611d5257808060200190518101906130dd91906145b2565b611d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecc565b60008181526002830160205260408120548015158061318d575061318d848461321f565b612d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ecc565b60008281526002840160205260408120829055612efa848461322b565b6060612efa8484600085613237565b6000612d368383613350565b6000612d368383613368565b6060824710156132c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ecc565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132f29190613d77565b60006040518083038185875af1925050503d806000811461332f576040519150601f19603f3d011682016040523d82523d6000602084013e613334565b606091505b5091509150613345878383876133b7565b979650505050505050565b60008181526001830160205260408120541515612d36565b60008181526001830160205260408120546133af57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b77565b506000610b77565b6060831561344d5782516000036134465773ffffffffffffffffffffffffffffffffffffffff85163b613446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecc565b5081612efa565b612efa83838151156134625781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc91906136b1565b5080546134a290613c52565b6000825580601f106134b2575050565b601f01602090049060005260206000209081019061289591905b808211156134e057600081556001016134cc565b5090565b6000602082840312156134f657600080fd5b5035919050565b6020810160038310613538577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461289557600080fd5b60008060006040848603121561356957600080fd5b83356135748161353e565b9250602084013567ffffffffffffffff8082111561359157600080fd5b818601915086601f8301126135a557600080fd5b8135818111156135b457600080fd5b8760208285010111156135c657600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff8116811461289557600080fd5b60006020828403121561360d57600080fd5b8135612d36816135d9565b801515811461289557600080fd5b60006020828403121561363857600080fd5b8135612d3681613618565b60005b8381101561365e578181015183820152602001613646565b50506000910152565b6000815180845261367f816020860160208601613643565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d366020830184613667565b6000602082840312156136d657600080fd5b8135612d368161353e565b6040815260006136f46040830185613667565b82810360208401526137068185613667565b95945050505050565b6000806040838503121561372257600080fd5b823561372d816135d9565b946020939093013593505050565b60008060006060848603121561375057600080fd5b833561375b816135d9565b9250602084013561376b816135d9565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156137ce578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613791565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261381360c0840182613667565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261384f8383613667565b925060808601519150808584030160a086015250613706828261377c565b6000806040838503121561388057600080fd5b823591506020830135613892816135d9565b809150509250929050565b60008083601f8401126138af57600080fd5b50813567ffffffffffffffff8111156138c757600080fd5b6020830191508360208260051b85010111156138e257600080fd5b9250929050565b600080600080604085870312156138ff57600080fd5b843567ffffffffffffffff8082111561391757600080fd5b6139238883890161389d565b9096509450602087013591508082111561393c57600080fd5b506139498782880161389d565b95989497509550505050565b60006020828403121561396757600080fd5b813567ffffffffffffffff81111561397e57600080fd5b820160a08185031215612d3657600080fd5b600080602083850312156139a357600080fd5b823567ffffffffffffffff8111156139ba57600080fd5b6139c68582860161389d565b90969095509350505050565b600080604083850312156139e557600080fd5b82356139f08161353e565b91506020830135613892816135d9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a5257613a52613a00565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a9f57613a9f613a00565b604052919050565b600082601f830112613ab857600080fd5b813567ffffffffffffffff811115613ad257613ad2613a00565b613b0360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a58565b818152846020838601011115613b1857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b4a57600080fd5b8335613b558161353e565b925060208481013567ffffffffffffffff80821115613b7357600080fd5b818701915087601f830112613b8757600080fd5b813581811115613b9957613b99613a00565b613ba7848260051b01613a58565b81815260069190911b8301840190848101908a831115613bc657600080fd5b938501935b82851015613c12576040858c031215613be45760008081fd5b613bec613a2f565b8535613bf7816135d9565b81528587013587820152825260409094019390850190613bcb565b965050506040870135925080831115613c2a57600080fd5b5050613c3886828701613aa7565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613c6657607f821691505b602082108103613c9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613d0857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d4757600080fd5b83018035915067ffffffffffffffff821115613d6257600080fd5b6020019150368190038213156138e257600080fd5b60008251613d08818460208701613643565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613dbe57600080fd5b830160208101925035905067ffffffffffffffff811115613dde57600080fd5b8036038213156138e257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156137ce578135613e59816135d9565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613e46565b602081528135602082015260006020830135613ea68161353e565b67ffffffffffffffff8082166040850152613ec46040860186613d89565b925060a06060860152613edb60c086018483613ded565b925050613eeb6060860186613d89565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f21858385613ded565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613f5a57600080fd5b60209288019283019235915083821115613f7357600080fd5b8160061b3603831315613f8557600080fd5b8685030160a0870152613345848284613e36565b601f821115611d52576000816000526020600020601f850160051c81016020861015613fc25750805b601f850160051c820191505b818110156120dc57828155600101613fce565b67ffffffffffffffff831115613ff957613ff9613a00565b61400d836140078354613c52565b83613f99565b6000601f84116001811461405f57600085156140295750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115f2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140ae578685013582556020948501946001909201910161408e565b50868210156140e9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135614135816135d9565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561419b5761419b613a00565b8054838255808410156142285760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146141dc576141dc6140fb565b80861686146141ed576141ed6140fb565b5060008360005260206000208360011b81018760011b820191505b80821015614223578282558284830155600282019150614208565b505050505b5060008181526020812083915b858110156120dc57614247838361412a565b6040929092019160029190910190600101614235565b813581556001810160208301356142738161353e565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556142b36040860186613d12565b935091506142c5838360028701613fe1565b6142d26060860186613d12565b935091506142e4838360038701613fe1565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261431b57600080fd5b91840191823591508082111561433057600080fd5b506020820191508060061b360382131561434957600080fd5b612c17818360048601614182565b815167ffffffffffffffff81111561437157614371613a00565b6143858161437f8454613c52565b84613f99565b602080601f8311600181146143d857600084156143a25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556120dc565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561442557888601518255948401946001909101908401614406565b508582101561446157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d0857600080fd5b602081526000612efa602083018486613ded565b80820180821115610b7757610b776140fb565b67ffffffffffffffff83168152604060208201526000825160a060408401526144f860e0840182613667565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145348383613667565b92506040860151915080858403016080860152614551838361377c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061458f8282613667565b9695505050505050565b6000602082840312156145ab57600080fd5b5051919050565b6000602082840312156145c457600080fd5b8151612d368161361856fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -1053,23 +1053,41 @@ func (it *PingPongDemoChainAddedIterator) Close() error { type PingPongDemoChainAdded struct { RemoteChainSelector uint64 - Recipient []byte + Recipient common.Hash ExtraArgsBytes []byte Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterChainAdded(opts *bind.FilterOpts) (*PingPongDemoChainAddedIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*PingPongDemoChainAddedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainAdded") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } return &PingPongDemoChainAddedIterator{contract: _PingPongDemo.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainAdded") + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -1175,18 +1193,28 @@ type PingPongDemoChainRemoved struct { Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*PingPongDemoChainRemovedIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*PingPongDemoChainRemovedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainRemoved") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } return &PingPongDemoChainRemovedIterator{contract: _PingPongDemo.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainRemoved") + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -3084,15 +3112,15 @@ type PingPongDemoInterface interface { ParseCCIPRouterModified(log types.Log) (*PingPongDemoCCIPRouterModified, error) - FilterChainAdded(opts *bind.FilterOpts) (*PingPongDemoChainAddedIterator, error) + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*PingPongDemoChainAddedIterator, error) - WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded) (event.Subscription, error) + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) ParseChainAdded(log types.Log) (*PingPongDemoChainAdded, error) - FilterChainRemoved(opts *bind.FilterOpts) (*PingPongDemoChainRemovedIterator, error) + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*PingPongDemoChainRemovedIterator, error) - WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved) (event.Subscription, error) + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved, removeChainSelector []uint64) (event.Subscription, error) ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, 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 8065ff8c18..5b3f57c4dc 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b50604051620052153803806200521583398101604081905262000034916200059f565b828281818181818181803380600081620000955760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c857620000c8816200017b565b5050506001600160a01b038116620000f3576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200014157620001416001600160a01b0382168360001962000226565b50505050505050508060026200015891906200060e565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070e565b336001600160a01b03821603620001d55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008c565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e919062000634565b620002aa91906200064e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000306918691906200030c16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200035b906001600160a01b038516908490620003e2565b805190915015620003dd57808060200190518101906200037c91906200066a565b620003dd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008c565b505050565b6060620003f38484600085620003fb565b949350505050565b6060824710156200045e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008c565b600080866001600160a01b031685876040516200047c9190620006bb565b60006040518083038185875af1925050503d8060008114620004bb576040519150601f19603f3d011682016040523d82523d6000602084013e620004c0565b606091505b509092509050620004d487838387620004df565b979650505050505050565b60608315620005535782516000036200054b576001600160a01b0385163b6200054b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008c565b5081620003f3565b620003f383838151156200056a5781518083602001fd5b8060405162461bcd60e51b81526004016200008c9190620006d9565b6001600160a01b03811681146200059c57600080fd5b50565b600080600060608486031215620005b557600080fd5b8351620005c28162000586565b6020850151909350620005d58162000586565b604085015190925060ff81168114620005ed57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200062d576200062d620005f8565b5092915050565b6000602082840312156200064757600080fd5b5051919050565b80820180821115620006645762000664620005f8565b92915050565b6000602082840312156200067d57600080fd5b815180151581146200068e57600080fd5b9392505050565b60005b83811015620006b257818101518382015260200162000698565b50506000910152565b60008251620006cf81846020870162000695565b9190910192915050565b6020815260008251806020840152620006fa81604085016020870162000695565b601f01601f19169190910160400192915050565b614af7806200071e6000396000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063b5a11011116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063b5a1101114610659578063bee518a414610679578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b80639d2aede5116100ec5780639d2aede5146105b65780639fe74e26146105d6578063b0f479a1146105f6578063b187bd261461062157600080fd5b80638462a2b91461052b57806385572ffb1461054b5780638da5cb5b1461056b5780638f491cba1461059657600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ad5780636fef519e146104cd57806379ba50971461051657600080fd5b80635e35359e146104605780636939cd971461048057600080fd5b806335f170ef146103c45780634e12498b146103f25780635075a9d414610412578063536c6bfa1461044057600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b50610259610244366004613955565b60096020526000908152604090205460ff1681565b604051610266919061396e565b60405180910390f35b34801561027b57600080fd5b5061028f61028a3660046139c5565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613a6c565b6107f3565b005b3480156102cd57600080fd5b506102bf6102dc366004613a97565b610967565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613b22565b34801561034357600080fd5b506102bf610352366004613b35565b6109c1565b34801561036357600080fd5b506102bf610a04565b34801561037857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613b35565b610a40565b604051610266929190613b52565b3480156103fe57600080fd5b506102bf61040d366004613a6c565b610b6c565b34801561041e57600080fd5b5061043261042d366004613955565b610c38565b604051908152602001610266565b34801561044c57600080fd5b506102bf61045b366004613b80565b610c4b565b34801561046c57600080fd5b506102bf61047b366004613bac565b610caf565b34801561048c57600080fd5b506104a061049b366004613955565b610d44565b6040516102669190613c4a565b3480156104b957600080fd5b506102bf6104c8366004613cde565b610f4f565b3480156104d957600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052257600080fd5b506102bf611269565b34801561053757600080fd5b506102bf610546366004613d5a565b611366565b34801561055757600080fd5b506102bf610566366004613dc6565b6116c7565b34801561057757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a257600080fd5b506102bf6105b1366004613955565b6119d4565b3480156105c257600080fd5b506102bf6105d1366004613a6c565b611bb0565b3480156105e257600080fd5b506102bf6105f1366004613e01565b611c6b565b34801561060257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561062d57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561066557600080fd5b506102bf610674366004613e43565b611feb565b34801561068557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b3480156106ae57600080fd5b506102bf6106bd366004613dc6565b61215b565b3480156106ce57600080fd5b506102bf6106dd366004613955565b612378565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b610432610736366004613fa6565b6125e2565b34801561074757600080fd5b506102bf6107563660046140b3565b612b18565b34801561076757600080fd5b506102bf610776366004613a6c565b612ba9565b34801561078757600080fd5b5060085461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d790859085906140d6565b9081526040519081900360200190205460ff1690509392505050565b6107fb612bba565b60085473ffffffffffffffffffffffffffffffffffffffff161561085c5761085c61083b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612c3b565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610909576109096108c960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612e3b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61096f612bba565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109c9612bba565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a0c612bba565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a3e6001612f3f565b565b600360205260009081526040902080548190610a5b906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a87906140e6565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b505050505090806001018054610ae9906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b15906140e6565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905082565b610b74612bba565b73ffffffffffffffffffffffffffffffffffffffff8116610bc1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610c4560058361319b565b92915050565b610c53612bba565b610c5d82826131ae565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610cb7612bba565b610cd873ffffffffffffffffffffffffffffffffffffffff84168383613308565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610d3791815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610db3906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddf906140e6565b8015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b50505050508152602001600382018054610e45906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e71906140e6565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f415760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610eec565b505050915250909392505050565b610f57612bba565b6001610f6460058461319b565b14610fa3576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610fb38260025b6005919061335e565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610ffb906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611027906140e6565b80156110745780601f1061104957610100808354040283529160200191611074565b820191906000526020600020905b81548152906001019060200180831161105757829003601f168201915b5050505050815260200160038201805461108d906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546110b9906140e6565b80156111065780601f106110db57610100808354040283529160200191611106565b820191906000526020600020905b8154815290600101906020018083116110e957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156111895760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611134565b5050505081525050905060005b8160800151518110156112185761121083836080015183815181106111bd576111bd614139565b602002602001015160200151846080015184815181106111df576111df614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166133089092919063ffffffff16565b600101611196565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610f9a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61136e612bba565b60005b81811015611511576003600084848481811061138f5761138f614139565b90506020028101906113a19190614168565b6113af906020810190613b35565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106113e6576113e6614139565b90506020028101906113f89190614168565b6114069060208101906141a6565b6040516114149291906140d6565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061145b5761145b614139565b905060200281019061146d9190614168565b61147b9060208101906141a6565b6040516114899291906140d6565b60405180910390208383838181106114a3576114a3614139565b90506020028101906114b59190614168565b6114c3906020810190613b35565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611501911515815260200190565b60405180910390a3600101611371565b5060005b838110156116c05760016003600087878581811061153557611535614139565b90506020028101906115479190614168565b611555906020810190613b35565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061158c5761158c614139565b905060200281019061159e9190614168565b6115ac9060208101906141a6565b6040516115ba9291906140d6565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061160a5761160a614139565b905060200281019061161c9190614168565b61162a9060208101906141a6565b6040516116389291906140d6565b604051809103902085858381811061165257611652614139565b90506020028101906116649190614168565b611672906020810190613b35565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516116b0911515815260200190565b60405180910390a3600101611515565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461171a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610f9a565b61172a6040820160208301613b35565b61173760408301836141a6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061178e925090506140e6565b159050806117e45750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117cf919061420b565b9081526040519081900360200190205460ff16155b1561181d57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b22565b61182d6040840160208501613b35565b67ffffffffffffffff8116600090815260036020526040902080548190611853906140e6565b905060000361189a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906118d690889060040161431f565b600060405180830381600087803b1580156118f057600080fd5b505af1925050508015611901575060015b6119a1573d80801561192f576040519150601f19603f3d011682016040523d82523d6000602084013e611934565b606091505b5061194186356001610faa565b5085356000908152600460205260409020869061195e82826146f1565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611993908490613b22565b60405180910390a2506116c0565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff161580611a2c5750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b15611a345750565b600a54600190611a68907d010000000000000000000000000000000000000000000000000000000000900460ff16836147eb565b11611bad5760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b249190614826565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611bb8612bba565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff16600090815260036020522090611c679082614843565b5050565b611c73612bba565b60005b81811015611fe657828282818110611c9057611c90614139565b9050602002810190611ca2919061495d565b611cb3906040810190602001613a97565b611d865760036000848484818110611ccd57611ccd614139565b9050602002810190611cdf919061495d565b611ced906020810190613b35565b67ffffffffffffffff16815260208101919091526040016000908120611d1291613907565b7f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916838383818110611d4557611d45614139565b9050602002810190611d57919061495d565b611d65906020810190613b35565b60405167ffffffffffffffff909116815260200160405180910390a1611fde565b828282818110611d9857611d98614139565b9050602002810190611daa919061495d565b611db89060408101906141a6565b9050600003611df3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611e0b57611e0b614139565b9050602002810190611e1d919061495d565b611e2b906020810190613b35565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611e6157611e61614139565b9050602002810190611e73919061495d565b611e819060408101906141a6565b8291611e8e919083614475565b50838383818110611ea157611ea1614139565b9050602002810190611eb3919061495d565b611ec19060608101906141a6565b159050611f0c57838383818110611eda57611eda614139565b9050602002810190611eec919061495d565b611efa9060608101906141a6565b6001830191611f0a919083614475565b505b7f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212848484818110611f3f57611f3f614139565b9050602002810190611f51919061495d565b611f5f906020810190613b35565b858585818110611f7157611f71614139565b9050602002810190611f83919061495d565b611f919060408101906141a6565b878787818110611fa357611fa3614139565b9050602002810190611fb5919061495d565b611fc39060608101906141a6565b604051611fd4959493929190614991565b60405180910390a1505b600101611c76565b505050565b611ff3612bba565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526120ae9161420b565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611fe69082614843565b333014612194576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a46040820160208301613b35565b6121b160408301836141a6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350612208925090506140e6565b1590508061225e5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051612249919061420b565b9081526040519081900360200190205460ff16155b1561229757806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b22565b6122a76040840160208501613b35565b67ffffffffffffffff81166000908152600360205260409020805481906122cd906140e6565b9050600003612314576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b600061232360608701876141a6565b8101906123309190613955565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff166123705761237061236b8260016149d4565b612f3f565b505050505050565b600161238560058361319b565b146123bf576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610f9a565b6123ca816000610faa565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191612412906140e6565b80601f016020809104026020016040519081016040528092919081815260200182805461243e906140e6565b801561248b5780601f106124605761010080835404028352916020019161248b565b820191906000526020600020905b81548152906001019060200180831161246e57829003601f168201915b505050505081526020016003820180546124a4906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546124d0906140e6565b801561251d5780601f106124f25761010080835404028352916020019161251d565b820191906000526020600020905b81548152906001019060200180831161250057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156125a05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161254b565b505050508152505090506125b381613373565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061260b906140e6565b9050600003612652576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190612682906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546126ae906140e6565b80156126fb5780601f106126d0576101008083540402835291602001916126fb565b820191906000526020600020905b8154815290600101906020018083116126de57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161275c906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054612788906140e6565b80156127d55780601f106127aa576101008083540402835291602001916127d5565b820191906000526020600020905b8154815290600101906020018083116127b857829003601f168201915b5050505050815250905060005b865181101561293257612852333089848151811061280257612802614139565b6020026020010151602001518a858151811061282057612820614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661337b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061288257612882614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461292a57600254875161292a9173ffffffffffffffffffffffffffffffffffffffff16908990849081106128db576128db614139565b6020026020010151602001518984815181106128f9576128f9614139565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c3b9092919063ffffffff16565b6001016127e2565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded9061298c908b9086906004016149e7565b602060405180830381865afa1580156129a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cd9190614ab4565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612a1357600854612a139073ffffffffffffffffffffffffffffffffffffffff1633308461337b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612a45576000612a47565b825b8a856040518463ffffffff1660e01b8152600401612a669291906149e7565b60206040518083038185885af1158015612a84573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612aa99190614ab4565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612b20612bba565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612bb1612bba565b611bad816133d9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f9a565b801580612cdb57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd99190614ab4565b155b612d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611fe69084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526134ce565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed69190614ab4565b612ee091906149d4565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612f399085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612db9565b50505050565b80600116600103612f82576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612fb6565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612fbf816119d4565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161302391815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561309d57816020015b60408051808201909152600080825260208201528152602001906001900390816130765790505b50815260085473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604080519182018152600082529091015290506130f460025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f9916131589167ffffffffffffffff9091169085906004016149e7565b6020604051808303816000875af1158015613177573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe69190614ab4565b60006131a783836135da565b9392505050565b80471015613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f9a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613272576040519150601f19603f3d011682016040523d82523d6000602084013e613277565b606091505b5050905080611fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611fe69084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612db9565b600061336b848484613664565b949350505050565b611bad612bba565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f399085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612db9565b3373ffffffffffffffffffffffffffffffffffffffff821603613458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f9a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613530826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136819092919063ffffffff16565b805190915015611fe6578080602001905181019061354e9190614acd565b611fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9a565b6000818152600283016020526040812054801515806135fe57506135fe8484613690565b6131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610f9a565b6000828152600284016020526040812082905561336b848461369c565b606061336b84846000856136a8565b60006131a783836137c1565b60006131a783836137d9565b60608247101561373a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613763919061420b565b60006040518083038185875af1925050503d80600081146137a0576040519150601f19603f3d011682016040523d82523d6000602084013e6137a5565b606091505b50915091506137b687838387613828565b979650505050505050565b600081815260018301602052604081205415156131a7565b600081815260018301602052604081205461382057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c45565b506000610c45565b606083156138be5782516000036138b75773ffffffffffffffffffffffffffffffffffffffff85163b6138b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9a565b508161336b565b61336b83838151156138d35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b22565b508054613913906140e6565b6000825580601f10613923575050565b601f016020900490600052602060002090810190611bad91905b80821115613951576000815560010161393d565b5090565b60006020828403121561396757600080fd5b5035919050565b60208101600383106139a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611bad57600080fd5b6000806000604084860312156139da57600080fd5b83356139e5816139af565b9250602084013567ffffffffffffffff80821115613a0257600080fd5b818601915086601f830112613a1657600080fd5b813581811115613a2557600080fd5b876020828501011115613a3757600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff81168114611bad57600080fd5b600060208284031215613a7e57600080fd5b81356131a781613a4a565b8015158114611bad57600080fd5b600060208284031215613aa957600080fd5b81356131a781613a89565b60005b83811015613acf578181015183820152602001613ab7565b50506000910152565b60008151808452613af0816020860160208601613ab4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a76020830184613ad8565b600060208284031215613b4757600080fd5b81356131a7816139af565b604081526000613b656040830185613ad8565b8281036020840152613b778185613ad8565b95945050505050565b60008060408385031215613b9357600080fd5b8235613b9e81613a4a565b946020939093013593505050565b600080600060608486031215613bc157600080fd5b8335613bcc81613a4a565b92506020840135613bdc81613a4a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613c3f578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613c02565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613c8460c0840182613ad8565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613cc08383613ad8565b925060808601519150808584030160a086015250613b778282613bed565b60008060408385031215613cf157600080fd5b823591506020830135613d0381613a4a565b809150509250929050565b60008083601f840112613d2057600080fd5b50813567ffffffffffffffff811115613d3857600080fd5b6020830191508360208260051b8501011115613d5357600080fd5b9250929050565b60008060008060408587031215613d7057600080fd5b843567ffffffffffffffff80821115613d8857600080fd5b613d9488838901613d0e565b90965094506020870135915080821115613dad57600080fd5b50613dba87828801613d0e565b95989497509550505050565b600060208284031215613dd857600080fd5b813567ffffffffffffffff811115613def57600080fd5b820160a081850312156131a757600080fd5b60008060208385031215613e1457600080fd5b823567ffffffffffffffff811115613e2b57600080fd5b613e3785828601613d0e565b90969095509350505050565b60008060408385031215613e5657600080fd5b8235613e61816139af565b91506020830135613d0381613a4a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613ec357613ec3613e71565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613f1057613f10613e71565b604052919050565b600082601f830112613f2957600080fd5b813567ffffffffffffffff811115613f4357613f43613e71565b613f7460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613ec9565b818152846020838601011115613f8957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613fbb57600080fd5b8335613fc6816139af565b925060208481013567ffffffffffffffff80821115613fe457600080fd5b818701915087601f830112613ff857600080fd5b81358181111561400a5761400a613e71565b614018848260051b01613ec9565b81815260069190911b8301840190848101908a83111561403757600080fd5b938501935b82851015614083576040858c0312156140555760008081fd5b61405d613ea0565b853561406881613a4a565b8152858701358782015282526040909401939085019061403c565b96505050604087013592508083111561409b57600080fd5b50506140a986828701613f18565b9150509250925092565b6000602082840312156140c557600080fd5b813560ff811681146131a757600080fd5b8183823760009101908152919050565b600181811c908216806140fa57607f821691505b602082108103614133577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261419c57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126141db57600080fd5b83018035915067ffffffffffffffff8211156141f657600080fd5b602001915036819003821315613d5357600080fd5b6000825161419c818460208701613ab4565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261425257600080fd5b830160208101925035905067ffffffffffffffff81111561427257600080fd5b803603821315613d5357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613c3f5781356142ed81613a4a565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016142da565b60208152813560208201526000602083013561433a816139af565b67ffffffffffffffff8082166040850152614358604086018661421d565b925060a0606086015261436f60c086018483614281565b92505061437f606086018661421d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526143b5858385614281565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126143ee57600080fd5b6020928801928301923591508382111561440757600080fd5b8160061b360383131561441957600080fd5b8685030160a08701526137b68482846142ca565b601f821115611fe6576000816000526020600020601f850160051c810160208610156144565750805b601f850160051c820191505b8181101561237057828155600101614462565b67ffffffffffffffff83111561448d5761448d613e71565b6144a18361449b83546140e6565b8361442d565b6000601f8411600181146144f357600085156144bd5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556116c0565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156145425786850135825560209485019460019092019101614522565b508682101561457d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356145c981613a4a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561462f5761462f613e71565b8054838255808410156146bc5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146146705761467061458f565b80861686146146815761468161458f565b5060008360005260206000208360011b81018760011b820191505b808210156146b757828255828483015560028201915061469c565b505050505b5060008181526020812083915b85811015612370576146db83836145be565b60409290920191600291909101906001016146c9565b81358155600181016020830135614707816139af565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561474760408601866141a6565b93509150614759838360028701614475565b61476660608601866141a6565b93509150614778838360038701614475565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126147af57600080fd5b9184019182359150808211156147c457600080fd5b506020820191508060061b36038213156147dd57600080fd5b612f39818360048601614616565b600082614821577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561483857600080fd5b81516131a781613a4a565b815167ffffffffffffffff81111561485d5761485d613e71565b6148718161486b84546140e6565b8461442d565b602080601f8311600181146148c4576000841561488e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612370565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614911578886015182559484019460019091019084016148f2565b508582101561494d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261419c57600080fd5b67ffffffffffffffff861681526060602082015260006149b5606083018688614281565b82810360408401526149c8818587614281565b98975050505050505050565b80820180821115610c4557610c4561458f565b67ffffffffffffffff83168152604060208201526000825160a06040840152614a1360e0840182613ad8565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614a4f8383613ad8565b92506040860151915080858403016080860152614a6c8383613bed565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250614aaa8282613ad8565b9695505050505050565b600060208284031215614ac657600080fd5b5051919050565b600060208284031215614adf57600080fd5b81516131a781613a8956fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b50604051620051fc380380620051fc83398101604081905262000034916200059f565b828281818181818181803380600081620000955760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c857620000c8816200017b565b5050506001600160a01b038116620000f3576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200014157620001416001600160a01b0382168360001962000226565b50505050505050508060026200015891906200060e565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070e565b336001600160a01b03821603620001d55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008c565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e919062000634565b620002aa91906200064e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000306918691906200030c16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200035b906001600160a01b038516908490620003e2565b805190915015620003dd57808060200190518101906200037c91906200066a565b620003dd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008c565b505050565b6060620003f38484600085620003fb565b949350505050565b6060824710156200045e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008c565b600080866001600160a01b031685876040516200047c9190620006bb565b60006040518083038185875af1925050503d8060008114620004bb576040519150601f19603f3d011682016040523d82523d6000602084013e620004c0565b606091505b509092509050620004d487838387620004df565b979650505050505050565b60608315620005535782516000036200054b576001600160a01b0385163b6200054b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008c565b5081620003f3565b620003f383838151156200056a5781518083602001fd5b8060405162461bcd60e51b81526004016200008c9190620006d9565b6001600160a01b03811681146200059c57600080fd5b50565b600080600060608486031215620005b557600080fd5b8351620005c28162000586565b6020850151909350620005d58162000586565b604085015190925060ff81168114620005ed57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200062d576200062d620005f8565b5092915050565b6000602082840312156200064757600080fd5b5051919050565b80820180821115620006645762000664620005f8565b92915050565b6000602082840312156200067d57600080fd5b815180151581146200068e57600080fd5b9392505050565b60005b83811015620006b257818101518382015260200162000698565b50506000910152565b60008251620006cf81846020870162000695565b9190910192915050565b6020815260008251806020840152620006fa81604085016020870162000695565b601f01601f19169190910160400192915050565b614ade806200071e6000396000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063b5a11011116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063b5a1101114610659578063bee518a414610679578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b80639d2aede5116100ec5780639d2aede5146105b65780639fe74e26146105d6578063b0f479a1146105f6578063b187bd261461062157600080fd5b80638462a2b91461052b57806385572ffb1461054b5780638da5cb5b1461056b5780638f491cba1461059657600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ad5780636fef519e146104cd57806379ba50971461051657600080fd5b80635e35359e146104605780636939cd971461048057600080fd5b806335f170ef146103c45780634e12498b146103f25780635075a9d414610412578063536c6bfa1461044057600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b5061025961024436600461396b565b60096020526000908152604090205460ff1681565b6040516102669190613984565b60405180910390f35b34801561027b57600080fd5b5061028f61028a3660046139db565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613a82565b6107f3565b005b3480156102cd57600080fd5b506102bf6102dc366004613aad565b610967565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613b38565b34801561034357600080fd5b506102bf610352366004613b4b565b6109c1565b34801561036357600080fd5b506102bf610a04565b34801561037857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613b4b565b610a40565b604051610266929190613b68565b3480156103fe57600080fd5b506102bf61040d366004613a82565b610b6c565b34801561041e57600080fd5b5061043261042d36600461396b565b610c38565b604051908152602001610266565b34801561044c57600080fd5b506102bf61045b366004613b96565b610c4b565b34801561046c57600080fd5b506102bf61047b366004613bc2565b610caf565b34801561048c57600080fd5b506104a061049b36600461396b565b610d44565b6040516102669190613c60565b3480156104b957600080fd5b506102bf6104c8366004613cf4565b610f4f565b3480156104d957600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052257600080fd5b506102bf611269565b34801561053757600080fd5b506102bf610546366004613d70565b611366565b34801561055757600080fd5b506102bf610566366004613ddc565b6116c7565b34801561057757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a257600080fd5b506102bf6105b136600461396b565b6119d4565b3480156105c257600080fd5b506102bf6105d1366004613a82565b611bb0565b3480156105e257600080fd5b506102bf6105f1366004613e17565b611c6b565b34801561060257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561062d57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561066557600080fd5b506102bf610674366004613e59565b612001565b34801561068557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b3480156106ae57600080fd5b506102bf6106bd366004613ddc565b612171565b3480156106ce57600080fd5b506102bf6106dd36600461396b565b61238e565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b610432610736366004613fbc565b6125f8565b34801561074757600080fd5b506102bf6107563660046140c9565b612b2e565b34801561076757600080fd5b506102bf610776366004613a82565b612bbf565b34801561078757600080fd5b5060085461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d790859085906140ec565b9081526040519081900360200190205460ff1690509392505050565b6107fb612bd0565b60085473ffffffffffffffffffffffffffffffffffffffff161561085c5761085c61083b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612c51565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610909576109096108c960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612e51565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61096f612bd0565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109c9612bd0565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a0c612bd0565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a3e6001612f55565b565b600360205260009081526040902080548190610a5b906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a87906140fc565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b505050505090806001018054610ae9906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b15906140fc565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905082565b610b74612bd0565b73ffffffffffffffffffffffffffffffffffffffff8116610bc1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610c456005836131b1565b92915050565b610c53612bd0565b610c5d82826131c4565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610cb7612bd0565b610cd873ffffffffffffffffffffffffffffffffffffffff8416838361331e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610d3791815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610db3906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddf906140fc565b8015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b50505050508152602001600382018054610e45906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e71906140fc565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f415760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610eec565b505050915250909392505050565b610f57612bd0565b6001610f646005846131b1565b14610fa3576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610fb38260025b60059190613374565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610ffb906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611027906140fc565b80156110745780601f1061104957610100808354040283529160200191611074565b820191906000526020600020905b81548152906001019060200180831161105757829003601f168201915b5050505050815260200160038201805461108d906140fc565b80601f01602080910402602001604051908101604052809291908181526020018280546110b9906140fc565b80156111065780601f106110db57610100808354040283529160200191611106565b820191906000526020600020905b8154815290600101906020018083116110e957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156111895760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611134565b5050505081525050905060005b8160800151518110156112185761121083836080015183815181106111bd576111bd61414f565b602002602001015160200151846080015184815181106111df576111df61414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661331e9092919063ffffffff16565b600101611196565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610f9a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61136e612bd0565b60005b81811015611511576003600084848481811061138f5761138f61414f565b90506020028101906113a1919061417e565b6113af906020810190613b4b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106113e6576113e661414f565b90506020028101906113f8919061417e565b6114069060208101906141bc565b6040516114149291906140ec565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061145b5761145b61414f565b905060200281019061146d919061417e565b61147b9060208101906141bc565b6040516114899291906140ec565b60405180910390208383838181106114a3576114a361414f565b90506020028101906114b5919061417e565b6114c3906020810190613b4b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611501911515815260200190565b60405180910390a3600101611371565b5060005b838110156116c0576001600360008787858181106115355761153561414f565b9050602002810190611547919061417e565b611555906020810190613b4b565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061158c5761158c61414f565b905060200281019061159e919061417e565b6115ac9060208101906141bc565b6040516115ba9291906140ec565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061160a5761160a61414f565b905060200281019061161c919061417e565b61162a9060208101906141bc565b6040516116389291906140ec565b60405180910390208585838181106116525761165261414f565b9050602002810190611664919061417e565b611672906020810190613b4b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516116b0911515815260200190565b60405180910390a3600101611515565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461171a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610f9a565b61172a6040820160208301613b4b565b61173760408301836141bc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061178e925090506140fc565b159050806117e45750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117cf9190614221565b9081526040519081900360200190205460ff16155b1561181d57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b38565b61182d6040840160208501613b4b565b67ffffffffffffffff8116600090815260036020526040902080548190611853906140fc565b905060000361189a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906118d6908890600401614335565b600060405180830381600087803b1580156118f057600080fd5b505af1925050508015611901575060015b6119a1573d80801561192f576040519150601f19603f3d011682016040523d82523d6000602084013e611934565b606091505b5061194186356001610faa565b5085356000908152600460205260409020869061195e8282614707565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611993908490613b38565b60405180910390a2506116c0565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff161580611a2c5750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b15611a345750565b600a54600190611a68907d010000000000000000000000000000000000000000000000000000000000900460ff1683614801565b11611bad5760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b24919061483c565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611bb8612bd0565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff16600090815260036020522090611c679082614859565b5050565b611c73612bd0565b60005b81811015611ffc57828282818110611c9057611c9061414f565b9050602002810190611ca29190614973565b611cb3906040810190602001613aad565b611d7f5760036000848484818110611ccd57611ccd61414f565b9050602002810190611cdf9190614973565b611ced906020810190613b4b565b67ffffffffffffffff16815260208101919091526040016000908120611d129161391d565b828282818110611d2457611d2461414f565b9050602002810190611d369190614973565b611d44906020810190613b4b565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611ff4565b828282818110611d9157611d9161414f565b9050602002810190611da39190614973565b611db19060408101906141bc565b9050600003611dec576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611e0457611e0461414f565b9050602002810190611e169190614973565b611e24906020810190613b4b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611e5a57611e5a61414f565b9050602002810190611e6c9190614973565b611e7a9060408101906141bc565b8291611e8791908361448b565b50838383818110611e9a57611e9a61414f565b9050602002810190611eac9190614973565b611eba9060608101906141bc565b159050611f0557838383818110611ed357611ed361414f565b9050602002810190611ee59190614973565b611ef39060608101906141bc565b6001830191611f0391908361448b565b505b838383818110611f1757611f1761414f565b9050602002810190611f299190614973565b611f379060408101906141bc565b604051611f459291906140ec565b6040518091039020848484818110611f5f57611f5f61414f565b9050602002810190611f719190614973565b611f7f906020810190613b4b565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611fbc57611fbc61414f565b9050602002810190611fce9190614973565b611fdc9060608101906141bc565b604051611fea9291906149a7565b60405180910390a3505b600101611c76565b505050565b612009612bd0565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526120c491614221565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611ffc9082614859565b3330146121aa576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ba6040820160208301613b4b565b6121c760408301836141bc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061221e925090506140fc565b159050806122745750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161225f9190614221565b9081526040519081900360200190205460ff16155b156122ad57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b38565b6122bd6040840160208501613b4b565b67ffffffffffffffff81166000908152600360205260409020805481906122e3906140fc565b905060000361232a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b600061233960608701876141bc565b810190612346919061396b565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff16612386576123866123818260016149bb565b612f55565b505050505050565b600161239b6005836131b1565b146123d5576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610f9a565b6123e0816000610faa565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191612428906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054612454906140fc565b80156124a15780601f10612476576101008083540402835291602001916124a1565b820191906000526020600020905b81548152906001019060200180831161248457829003601f168201915b505050505081526020016003820180546124ba906140fc565b80601f01602080910402602001604051908101604052809291908181526020018280546124e6906140fc565b80156125335780601f1061250857610100808354040283529160200191612533565b820191906000526020600020905b81548152906001019060200180831161251657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156125b65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612561565b505050508152505090506125c981613389565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190612621906140fc565b9050600003612668576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190612698906140fc565b80601f01602080910402602001604051908101604052809291908181526020018280546126c4906140fc565b80156127115780601f106126e657610100808354040283529160200191612711565b820191906000526020600020905b8154815290600101906020018083116126f457829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191612772906140fc565b80601f016020809104026020016040519081016040528092919081815260200182805461279e906140fc565b80156127eb5780601f106127c0576101008083540402835291602001916127eb565b820191906000526020600020905b8154815290600101906020018083116127ce57829003601f168201915b5050505050815250905060005b86518110156129485761286833308984815181106128185761281861414f565b6020026020010151602001518a85815181106128365761283661414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16613391909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106128985761289861414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146129405760025487516129409173ffffffffffffffffffffffffffffffffffffffff16908990849081106128f1576128f161414f565b60200260200101516020015189848151811061290f5761290f61414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c519092919063ffffffff16565b6001016127f8565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906129a2908b9086906004016149ce565b602060405180830381865afa1580156129bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e39190614a9b565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612a2957600854612a299073ffffffffffffffffffffffffffffffffffffffff16333084613391565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612a5b576000612a5d565b825b8a856040518463ffffffff1660e01b8152600401612a7c9291906149ce565b60206040518083038185885af1158015612a9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612abf9190614a9b565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612b36612bd0565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612bc7612bd0565b611bad816133ef565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f9a565b801580612cf157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cef9190614a9b565b155b612d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ffc9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526134e4565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eec9190614a9b565b612ef691906149bb565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612f4f9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612dcf565b50505050565b80600116600103612f98576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612fcc565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612fd5816119d4565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161303991815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156130b357816020015b604080518082019091526000808252602082015281526020019060019003908161308c5790505b50815260085473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061310a60025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f99161316e9167ffffffffffffffff9091169085906004016149ce565b6020604051808303816000875af115801561318d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc9190614a9b565b60006131bd83836135f0565b9392505050565b8047101561322e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f9a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613288576040519150601f19603f3d011682016040523d82523d6000602084013e61328d565b606091505b5050905080611ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ffc9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612dcf565b600061338184848461367a565b949350505050565b611bad612bd0565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f4f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612dcf565b3373ffffffffffffffffffffffffffffffffffffffff82160361346e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f9a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613546826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136979092919063ffffffff16565b805190915015611ffc57808060200190518101906135649190614ab4565b611ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9a565b600081815260028301602052604081205480151580613614575061361484846136a6565b6131bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610f9a565b6000828152600284016020526040812082905561338184846136b2565b606061338184846000856136be565b60006131bd83836137d7565b60006131bd83836137ef565b606082471015613750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137799190614221565b60006040518083038185875af1925050503d80600081146137b6576040519150601f19603f3d011682016040523d82523d6000602084013e6137bb565b606091505b50915091506137cc8783838761383e565b979650505050505050565b600081815260018301602052604081205415156131bd565b600081815260018301602052604081205461383657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c45565b506000610c45565b606083156138d45782516000036138cd5773ffffffffffffffffffffffffffffffffffffffff85163b6138cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9a565b5081613381565b61338183838151156138e95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b38565b508054613929906140fc565b6000825580601f10613939575050565b601f016020900490600052602060002090810190611bad91905b808211156139675760008155600101613953565b5090565b60006020828403121561397d57600080fd5b5035919050565b60208101600383106139bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611bad57600080fd5b6000806000604084860312156139f057600080fd5b83356139fb816139c5565b9250602084013567ffffffffffffffff80821115613a1857600080fd5b818601915086601f830112613a2c57600080fd5b813581811115613a3b57600080fd5b876020828501011115613a4d57600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff81168114611bad57600080fd5b600060208284031215613a9457600080fd5b81356131bd81613a60565b8015158114611bad57600080fd5b600060208284031215613abf57600080fd5b81356131bd81613a9f565b60005b83811015613ae5578181015183820152602001613acd565b50506000910152565b60008151808452613b06816020860160208601613aca565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131bd6020830184613aee565b600060208284031215613b5d57600080fd5b81356131bd816139c5565b604081526000613b7b6040830185613aee565b8281036020840152613b8d8185613aee565b95945050505050565b60008060408385031215613ba957600080fd5b8235613bb481613a60565b946020939093013593505050565b600080600060608486031215613bd757600080fd5b8335613be281613a60565b92506020840135613bf281613a60565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613c55578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613c18565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613c9a60c0840182613aee565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613cd68383613aee565b925060808601519150808584030160a086015250613b8d8282613c03565b60008060408385031215613d0757600080fd5b823591506020830135613d1981613a60565b809150509250929050565b60008083601f840112613d3657600080fd5b50813567ffffffffffffffff811115613d4e57600080fd5b6020830191508360208260051b8501011115613d6957600080fd5b9250929050565b60008060008060408587031215613d8657600080fd5b843567ffffffffffffffff80821115613d9e57600080fd5b613daa88838901613d24565b90965094506020870135915080821115613dc357600080fd5b50613dd087828801613d24565b95989497509550505050565b600060208284031215613dee57600080fd5b813567ffffffffffffffff811115613e0557600080fd5b820160a081850312156131bd57600080fd5b60008060208385031215613e2a57600080fd5b823567ffffffffffffffff811115613e4157600080fd5b613e4d85828601613d24565b90969095509350505050565b60008060408385031215613e6c57600080fd5b8235613e77816139c5565b91506020830135613d1981613a60565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613ed957613ed9613e87565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613f2657613f26613e87565b604052919050565b600082601f830112613f3f57600080fd5b813567ffffffffffffffff811115613f5957613f59613e87565b613f8a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613edf565b818152846020838601011115613f9f57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613fd157600080fd5b8335613fdc816139c5565b925060208481013567ffffffffffffffff80821115613ffa57600080fd5b818701915087601f83011261400e57600080fd5b81358181111561402057614020613e87565b61402e848260051b01613edf565b81815260069190911b8301840190848101908a83111561404d57600080fd5b938501935b82851015614099576040858c03121561406b5760008081fd5b614073613eb6565b853561407e81613a60565b81528587013587820152825260409094019390850190614052565b9650505060408701359250808311156140b157600080fd5b50506140bf86828701613f2e565b9150509250925092565b6000602082840312156140db57600080fd5b813560ff811681146131bd57600080fd5b8183823760009101908152919050565b600181811c9082168061411057607f821691505b602082108103614149577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126141b257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126141f157600080fd5b83018035915067ffffffffffffffff82111561420c57600080fd5b602001915036819003821315613d6957600080fd5b600082516141b2818460208701613aca565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261426857600080fd5b830160208101925035905067ffffffffffffffff81111561428857600080fd5b803603821315613d6957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613c5557813561430381613a60565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016142f0565b602081528135602082015260006020830135614350816139c5565b67ffffffffffffffff808216604085015261436e6040860186614233565b925060a0606086015261438560c086018483614297565b9250506143956060860186614233565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526143cb858385614297565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261440457600080fd5b6020928801928301923591508382111561441d57600080fd5b8160061b360383131561442f57600080fd5b8685030160a08701526137cc8482846142e0565b601f821115611ffc576000816000526020600020601f850160051c8101602086101561446c5750805b601f850160051c820191505b8181101561238657828155600101614478565b67ffffffffffffffff8311156144a3576144a3613e87565b6144b7836144b183546140fc565b83614443565b6000601f84116001811461450957600085156144d35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556116c0565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156145585786850135825560209485019460019092019101614538565b5086821015614593577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356145df81613a60565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561464557614645613e87565b8054838255808410156146d25760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314614686576146866145a5565b8086168614614697576146976145a5565b5060008360005260206000208360011b81018760011b820191505b808210156146cd5782825582848301556002820191506146b2565b505050505b5060008181526020812083915b85811015612386576146f183836145d4565b60409290920191600291909101906001016146df565b8135815560018101602083013561471d816139c5565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561475d60408601866141bc565b9350915061476f83836002870161448b565b61477c60608601866141bc565b9350915061478e83836003870161448b565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126147c557600080fd5b9184019182359150808211156147da57600080fd5b506020820191508060061b36038213156147f357600080fd5b612f4f81836004860161462c565b600082614837577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561484e57600080fd5b81516131bd81613a60565b815167ffffffffffffffff81111561487357614873613e87565b6148878161488184546140fc565b84614443565b602080601f8311600181146148da57600084156148a45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612386565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561492757888601518255948401946001909101908401614908565b508582101561496357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141b257600080fd5b602081526000613381602083018486614297565b80820180821115610c4557610c456145a5565b67ffffffffffffffff83168152604060208201526000825160a060408401526149fa60e0840182613aee565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614a368383613aee565b92506040860151915080858403016080860152614a538383613c03565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250614a918282613aee565b9695505050505050565b600060208284031215614aad57600080fd5b5051919050565b600060208284031215614ac657600080fd5b81516131bd81613a9f56fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -1099,23 +1099,41 @@ func (it *SelfFundedPingPongChainAddedIterator) Close() error { type SelfFundedPingPongChainAdded struct { RemoteChainSelector uint64 - Recipient []byte + Recipient common.Hash ExtraArgsBytes []byte Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterChainAdded(opts *bind.FilterOpts) (*SelfFundedPingPongChainAddedIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongChainAddedIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ChainAdded") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } return &SelfFundedPingPongChainAddedIterator{contract: _SelfFundedPingPong.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainAdded) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ChainAdded") + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -1221,18 +1239,28 @@ type SelfFundedPingPongChainRemoved struct { Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*SelfFundedPingPongChainRemovedIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*SelfFundedPingPongChainRemovedIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ChainRemoved") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } return &SelfFundedPingPongChainRemovedIterator{contract: _SelfFundedPingPong.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainRemoved) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ChainRemoved") + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -3381,15 +3409,15 @@ type SelfFundedPingPongInterface interface { ParseCCIPRouterModified(log types.Log) (*SelfFundedPingPongCCIPRouterModified, error) - FilterChainAdded(opts *bind.FilterOpts) (*SelfFundedPingPongChainAddedIterator, error) + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongChainAddedIterator, error) - WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainAdded) (event.Subscription, error) + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) ParseChainAdded(log types.Log) (*SelfFundedPingPongChainAdded, error) - FilterChainRemoved(opts *bind.FilterOpts) (*SelfFundedPingPongChainRemovedIterator, error) + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*SelfFundedPingPongChainRemovedIterator, error) - WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainRemoved) (event.Subscription, error) + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongChainRemoved, removeChainSelector []uint64) (event.Subscription, error) ParseChainRemoved(log types.Log) (*SelfFundedPingPongChainRemoved, 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 7a5cab6f71..ef5bd481b2 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 d16b1843e9cc61c9ad4dcb75f69c45144c382f8d51d9b72888993ca18e594207 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 5863d38eaa2471878113f425c54bfe936db105bf5134ace7b231290c11df7fb7 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin becb56686bc251796f317159533d5c81ea034f5bb043f8f1d14d77be3bd5d1ac -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 40952c2869c3dadef3af5407a1183e451c2d19610aa6e39e92f6c3682bbbf194 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 0d3e5064f9ad28a28778279bcf9e392219f93132d6a04a6a7911d1245a39420d +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 1c75330f4f6cc75d7f0decf7ba84fce351ab8dc686199372d06ef2bc9bdc45e2 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e8e2eedb90cfaee9b2f6ed2130d882d139d45c6c736557efd8772923e5e9ab86 +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin fe42de7249e2984e7d59e8257db806f700679015e9343119f6ddc0bc8200c9ec ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -28,11 +28,11 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 7ac6fd85e962789cefe150a0959a79e02772c84658b02f89d09aa99853b5f3f3 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin fa020ab0510f1a48f448a5a93bc30ce8b984c73e6855b667f0f820e0ef4b0ecd 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 a438934d16529ff5d422f375cdff1c6e11212bdda4e77fb6ee68cf11cb1a930d +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin b24ddc90b532eaeb93088ab10339ac0c0310d1f14f0f32f48cdef569f59f6267 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 b26c912026d03e446438ea84f3cba9957dd133d4 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 9 Jul 2024 13:27:52 -0400 Subject: [PATCH 35/61] better comments and natspec --- contracts/gas-snapshots/ccip.gas-snapshot | 46 +++++++------- .../ccip/applications/external/CCIPBase.sol | 40 +++++++----- .../ccip/applications/external/CCIPClient.sol | 38 +++++++---- .../external/CCIPClientWithACK.sol | 62 ++++++++++++++++-- .../applications/external/CCIPReceiver.sol | 6 +- .../external/CCIPReceiverWithACK.sol | 63 +++++++------------ .../external/CCIPReceiverTest.t.sol | 12 +++- 7 files changed, 166 insertions(+), 101 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index d418eded46..8c7653acfb 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,8 +34,8 @@ 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_Success() (gas: 331825) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348272) +CCIPClientTest:test_ccipReceiveAndSendAck_Success() (gas: 331839) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348275) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) CCIPClientTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552173) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) @@ -88,18 +88,18 @@ 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: 193812) -CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 430948) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193794) +CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 430905) CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 445121) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 199816) -CCIPReceiverTest:test_modifyRouter_Success() (gas: 26470) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 427992) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 421204) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20689) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56254) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331794) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438731) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2948564) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 199985) +CCIPReceiverTest:test_modifyRouter_Success() (gas: 26446) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 427653) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 454419) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20667) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56277) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331828) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438737) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2956788) CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74835) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339572) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224467) @@ -208,7 +208,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181628) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190908) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48050) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 436547) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1697359) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 252012) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 174226) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193899) @@ -234,8 +234,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207956) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26001) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152913) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507883) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2308282) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1768860) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3413460) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 210050) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210613) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 670625) @@ -387,7 +387,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: 1678062) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1663435) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -419,14 +419,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: 1759547) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1744898) 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: 3171279) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3156679) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -693,8 +693,8 @@ 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: 308708) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17766) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 307350) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234292) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) @@ -842,8 +842,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: 290920) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 456179) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 289562) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448109) 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/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 86ece0a049..205db1cd14 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -23,9 +23,11 @@ abstract contract CCIPBase is OwnerIsCreator { event CCIPRouterModified(address indexed oldRouter, address indexed newRouter); event TokensWithdrawnByOwner(address indexed token, address indexed to, uint256 amount); - // TODO 2 events, add/remove - // TODO comment on the tradeoffs, short comment on why prefer indexed - event ApprovedSenderModified(uint64 indexed destChainSelector, bytes indexed recipient, bool isBeingApproved); + // Parameters are indexed to simplyify indexing of cross-chain dapps where contracts may be deployed with the same address. + // Since the updateApprovedSenders() function should be used sparingly by the contract owner, the additional gas cost should be negligible. If this function is needed to be used constantly, or with a large number of + // contracts, then an alternative and more gas-efficient method should be implemented instead, e.g. with merkle trees or indexing the parameters can be removed. + event ApprovedSenderAdded(uint64 indexed destChainSelector, bytes indexed recipient); + event ApprovedSenderRemoved(uint64 indexed destChainSelector, bytes indexed recipient); event ChainAdded(uint64 indexed remoteChainSelector, bytes indexed recipient, bytes extraArgsBytes); event ChainRemoved(uint64 indexed removeChainSelector); @@ -35,16 +37,16 @@ abstract contract CCIPBase is OwnerIsCreator { bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } - struct ChainUpdate { // TODO comments - uint64 chainSelector; - bool allowed; - bytes recipient; - bytes extraArgsBytes; + struct ChainUpdate { + uint64 chainSelector; // ──╮ The unique identifier for a chain to send/receive messages + bool allowed; // ──╯ Whether the chain should be enabled + bytes recipient; // Address on the remote chain which should receive incoming messages from this. The should only be one per-chain + bytes extraArgsBytes; // Additional arguments to pass with the message including manually specifying gas limit and and whether to allow out-of-order execution } struct ChainConfig { bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. - bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and OOO execution. + bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and out-of-order execution. mapping(bytes recipient => bool isApproved) approvedSender; // Mapping is nested to support work-flows where Dapps may need to receive messages from one-or-more contracts on a source chain, or to support one-sided dapp upgrades. } @@ -81,19 +83,19 @@ abstract contract CCIPBase is OwnerIsCreator { function updateApprovedSenders( ApprovedSenderUpdate[] calldata adds, ApprovedSenderUpdate[] calldata removes - ) external onlyOwner { + ) external virtual onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { delete s_chainConfigs[removes[i].destChainSelector].approvedSender[removes[i].sender]; // Third parameter is false to indicate that the sender's previous approval is being revoked, to improve off-chain event indexing - emit ApprovedSenderModified(removes[i].destChainSelector, removes[i].sender, false); + emit ApprovedSenderRemoved(removes[i].destChainSelector, removes[i].sender); } for (uint256 i = 0; i < adds.length; ++i) { s_chainConfigs[adds[i].destChainSelector].approvedSender[adds[i].sender] = true; // Third parameter is true to indicate that the sender is being approved, to improve off-chain event indexing - emit ApprovedSenderModified(adds[i].destChainSelector, adds[i].sender, true); + emit ApprovedSenderAdded(adds[i].destChainSelector, adds[i].sender); } } @@ -141,9 +143,10 @@ abstract contract CCIPBase is OwnerIsCreator { // │ Chain Management │ // ================================================================ - // TODO comments - // TODO name as updateRouter - function modifyRouter(address newRouter) external onlyOwner { + /// @notice Updates the address of the CCIP router to send/receive messages. + /// @dev function will can only be called by the owner, and should only be used in emergencies if the current CCIP Router is deprecated. + /// @param newRouter the address of the new router, cannot be the zero address. + function updateRouter(address newRouter) external onlyOwner { if (newRouter == address(0)) revert ZeroAddressNotAllowed(); // Store the old router in memory to emit event @@ -177,7 +180,8 @@ abstract contract CCIPBase is OwnerIsCreator { } } - // TODO comments + /// @notice Reverts if the specified chainSelector is not approved to send/receive messages to/from this contract + /// @param chainSelector the CCIP specific chain selector for a given remote-chain. modifier isValidChain(uint64 chainSelector) { // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; @@ -185,6 +189,10 @@ abstract contract CCIPBase is OwnerIsCreator { _; } + /// @notice Ensures if the specified chain is not enabled, or if the sender of an incoming message has not been approved by contract owner + /// @param chainSelector the CCIP specific chain selector for a given remote-chain. + /// @param sender the address of the sender of the message on the source-chain. + /// @dev The modifier will revert if either the sender is not approved OR if the relevant chain is currently disabled. modifier isValidSender(uint64 chainSelector, bytes memory sender) { // If the chain is disabled, then short-circuit trigger a revert because no sender should be valid if (s_chainConfigs[chainSelector].recipient.length == 0 || !s_chainConfigs[chainSelector].approvedSender[sender]) { diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 6da2db8bd9..c97b69302b 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {IRouterClient} from "../../interfaces/IRouterClient.sol"; import {Client} from "../../libraries/Client.sol"; -import {CCIPReceiverWithACK} from "./CCIPReceiverWithACK.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"; @@ -12,14 +12,23 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// @title CCIPClient /// @notice This contract implements logic for sending and receiving CCIP Messages. It utilizes CCIPReceiver's defensive patterns by default. /// @dev CCIPReceiver and CCIPSender cannot be simultaneously imported due to similar parents so CCIPSender functionality has been duplicated -// TODO make CCIPClient inherit from CCIPReceiver -contract CCIPClient is CCIPReceiverWithACK { +contract CCIPClient is CCIPReceiver { using SafeERC20 for IERC20; - constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} + IERC20 public s_feeToken; + + event MessageSent(bytes32 messageId); + + constructor(address router, IERC20 feeToken) CCIPReceiver(router) { + s_feeToken = feeToken; + } /// @notice sends a message through CCIP to the router - // TODO really beef up the comments here + /// @param destChainSelector The unique CCIP identifier for a destination chain + /// @param tokenAmounts An array of CCIP compatible tokens and their amounts to send through the bridge + /// @param data Arbitrary bytes to be sent to the destination address on the destination chain + /// @dev The recipient of the message and any extraArgs are set manually ahead of time using the applyChainUpdates() function in CCIPBase + /// @return messageId the unique message ID generated by the CCIP router and used to track message status. function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, @@ -50,17 +59,24 @@ contract CCIPClient is CCIPReceiverWithACK { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } - // TODO comment we only have messageId after calling ccipSend, so brekaing CEI is necessary - // messageId clac lives in OnRamp, which can be upgradaed, this it should be abstracted away from client impl + // messageId is only generated in the on-ramp, and therefore cannot be calcualated head of time. + // This necessitates breaking CEI but since the router is a trusted contract, any risks are negligible. messageId = IRouterClient(s_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, reflect this with bytes32(0) - emit MessageSent(messageId, bytes32(0)); + emit MessageSent(messageId); return messageId; } + + /// @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 + override + onlySelf + isValidSender(message.sourceChainSelector, message.sender) + isValidChain(message.sourceChainSelector) + {} } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index 0c62f4ced9..0568f2fab2 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -1,8 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {IRouterClient} from "../../interfaces/IRouterClient.sol"; import {Client} from "../../libraries/Client.sol"; -import {CCIPClient} from "./CCIPClient.sol"; +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"; @@ -10,16 +11,69 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// @title CCIPClientWithACK /// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. /// @dev ccipSend functionality has been inherited from CCIPClient.sol, and _sendACK() from CCIPReceiverWithACK, so only processMessage() must be overridden to enable full functionality for processing incoming messages for ACK's -contract CCIPClientWithACK is CCIPClient { +contract CCIPClientWithACK is CCIPReceiverWithACK { using SafeERC20 for IERC20; error CannotAcknowledgeUnsentMessage(bytes32); - constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} + + /// @notice sends a message through CCIP to the router + /// @param destChainSelector The unique CCIP identifier for a destination chain + /// @param tokenAmounts An array of CCIP compatible tokens and their amounts to send through the bridge + /// @param data Arbitrary bytes to be sent to the destination address on the destination chain + /// @dev The recipient of the message and any extraArgs are set manually ahead of time using the applyChainUpdates() function in CCIPBase + /// @return messageId the unique message ID generated by the CCIP router and used to track message status. + function ccipSend( + uint64 destChainSelector, + Client.EVMTokenAmount[] memory tokenAmounts, + bytes memory data + ) public payable virtual isValidChain(destChainSelector) returns (bytes32 messageId) { + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ + receiver: s_chainConfigs[destChainSelector].recipient, + data: data, + tokenAmounts: tokenAmounts, + extraArgs: s_chainConfigs[destChainSelector].extraArgsBytes, + feeToken: address(s_feeToken) + }); + + 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); + + // 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).safeApprove(s_ccipRouter, tokenAmounts[i].amount); + } + } + + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); + + // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken + if (address(s_feeToken) != address(0)) { + IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); + } + + messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( + destChainSelector, message + ); + + s_messageStatus[messageId] = CCIPReceiverWithACK.MessageStatus.SENT; + + emit MessageSent(messageId, bytes32(0)); + + return messageId; + } /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic - function processMessage(Client.Any2EVMMessage calldata message) external virtual override onlySelf { + function processMessage(Client.Any2EVMMessage calldata message) + external + virtual + override + onlySelf + isValidSender(message.sourceChainSelector, message.sender) + { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); if (payload.messageType == MessageType.OUTGOING) { diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 4b38c6a2d6..7b9b0b97cc 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -28,6 +28,7 @@ contract CCIPReceiver is CCIPBase { FAILED, // FAILED messages are messages which reverted during execution of processMessage() as part of the ccipReceive() try catch loop. ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable, and can only be triggered by the contract owner. // Only a message that was previously marked as FAILED can be abandoned. + } // The message contents of failed messages are stored here. @@ -50,7 +51,7 @@ contract CCIPReceiver is CCIPBase { external virtual onlyRouter - isValidChain(message.sourceChainSelector) // TODO should it validate sender as well? + isValidChain(message.sourceChainSelector) { try this.processMessage(message) {} catch (bytes memory err) { @@ -111,8 +112,7 @@ contract CCIPReceiver is CCIPBase { /// @dev If the owner wants to retrieve tokens without special logic, then abandonFailedMessage(), withdrawNativeTokens(), or withdrawTokens() should be used instead /// This function is marked onlyOwner, but is virtual. Allowing permissionless execution is not recommended but may be allowed if function is overridden function _retryFailedMessage(Client.Any2EVMMessage memory message) internal virtual onlyOwner { - // TODO how about we add a default implementation that calls `processMessage`, and comments for overrides - // The idea is to vend an example that works somewhat well out of the box + this.processMessage(message); } /// @notice Should be used to recover tokens from a failed message, while ensuring the message cannot be retried diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 5b598a6e14..31d164fe1c 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -11,7 +11,8 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; /// @title CCIPReceiverWithACK -/// TODO Beef this up +/// @notice Acts as a CCIP receiver, but upon receiving an incoming message, attempts to send a response back to the sender with an ACK packet indicating they received and processed the initial correspondence correctly. +/// @dev Messages received by this contract must be of special formatting in which any arbitrary data is first wrapped inside a MessagePayload struct, and must be processed first to ensure conformity. contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -21,29 +22,27 @@ contract CCIPReceiverWithACK is CCIPReceiver { event MessageAckSent(bytes32 incomingMessageId); event MessageSent(bytes32 indexed incomingMessageId, bytes32 indexed ACKMessageId); - // TODO named var - event MessageAckReceived(bytes32); + + event MessageAckReceived(bytes32 messageId); event FeeTokenModified(address indexed oldToken, address indexed newToken); - // TODO comments on OUTGOING vs. ACK, and OUTGOING is set in a child - // TODO consider moving this to CCIPClienWithACK because CCIPReceiver does not need to be aware of send/receives - // it is only concerned about receiving enum MessageType { - OUTGOING, - ACK + OUTGOING, // Indicates that a message is being sent for the first time to its recipient. + ACK // Indicates that another message of type "OUTGOING" has already been received, and an acknowledgement is being returned to the original sender, by the original recipient. + } - // TODO comments enum MessageStatus { - QUIET, - SENT, - ACKNOWLEDGED + QUIET, // A message which has not been sent yet, the default status for any messageId + SENT, // Indicates a message has been sent through CCIP but not yet received an ACK response from the recipient + ACKNOWLEDGED // The original SENT message was received and processed by the recipient, and confirmation of reception was received by this via the returned ACK message sent in response. + } struct MessagePayload { - bytes version; - bytes data; - MessageType messageType; + bytes version; // An optional byte string which can be used to denote the ACK version formatting or how to decode the remaining arbitrary data. + bytes data; // The Arbitrary data initially meant to be received by this contract and sent from the source chain. + MessageType messageType; // Denotes whether the incoming message is being received for the first time, or is an acknowledgement that the initial outgoing correspondence was successfully received. } string public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; @@ -79,38 +78,18 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit FeeTokenModified(oldFeeToken, token); } - // TODO review if this just be inherited - /// @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 - isValidSender(message.sourceChainSelector, message.sender) - isValidChain(message.sourceChainSelector) - { - try this.processMessage(message) {} - catch (bytes memory err) { - s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); - s_messageContents[message.messageId] = message; - - // 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; - } - - emit MessageSucceeded(message.messageId); - } - /// @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 /// 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 { + function processMessage(Client.Any2EVMMessage calldata message) + external + virtual + override + onlySelf + isValidSender(message.sourceChainSelector, message.sender) + { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); - // TODO CCIReceiverWithACK can just ack without message type checks // message type is a concept with ClientWithACK if (payload.messageType == MessageType.OUTGOING) { // Insert processing workflow here. 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 bac560975d..ec99aed57c 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 @@ -186,6 +186,14 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.startPrank(OWNER); + // The message failed initially because the sender was not approved. Now we approve it and retry processing. Because retryFailedMessage() calls processMessage normally, it should execute successfully now. + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: sourceChainSelector, sender: abi.encode(address(1))}); + + s_receiver.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); + vm.expectEmit(); emit CCIPReceiver.MessageRecovered(messageId); @@ -261,14 +269,14 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { function test_modifyRouter_Success() public { vm.expectRevert(abi.encodeWithSelector(CCIPBase.ZeroAddressNotAllowed.selector)); - s_receiver.modifyRouter(address(0)); + s_receiver.updateRouter(address(0)); address newRouter = address(0x1234); vm.expectEmit(); emit CCIPBase.CCIPRouterModified(address(s_destRouter), newRouter); - s_receiver.modifyRouter(newRouter); + s_receiver.updateRouter(newRouter); assertEq(s_receiver.getRouter(), newRouter, "Router Address not set correctly to the new router"); } From 5640b46717c21c22a00a3bdd2ba7de2cbbd77e85 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, 9 Jul 2024 17:34:18 +0000 Subject: [PATCH 36/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 718 +++++------------- .../generated/ccipReceiver/ccipReceiver.go | 231 +++++- .../ccip/generated/ccipSender/ccipSender.go | 231 +++++- .../ping_pong_demo/ping_pong_demo.go | 235 ++++-- .../self_funded_ping_pong.go | 235 ++++-- ...rapper-dependency-versions-do-not-edit.txt | 12 +- 6 files changed, 955 insertions(+), 707 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 9c06dba41a..8bf9c89544 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,8 +56,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\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004aa838038062004aa8833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b61440a806200069e6000396000f3fe6080604052600436106101795760003560e01c806379ba5097116100cb578063b0f479a11161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063b0f479a11461043d578063cf6730f814610468578063e4ca87541461048857600080fd5b806385572ffb116100b057806385572ffb146103b15780638da5cb5b146103d15780639fe74e261461041d57600080fd5b806379ba50971461037c5780638462a2b91461039157600080fd5b80635075a9d41161012d5780636939cd97116101075780636939cd97146102d95780636d62d633146103065780636fef519e1461032657600080fd5b80635075a9d41461026b578063536c6bfa146102995780635e35359e146102b957600080fd5b806311e85dff1161015e57806311e85dff146101fb57806335f170ef1461021d5780634e12498b1461024b57600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a03660046132a3565b60096020526000908152604090205460ff1681565b6040516101c291906132eb565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613342565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b6102163660046133e9565b610553565b005b34801561022957600080fd5b5061023d610238366004613406565b6106c7565b6040516101c2929190613491565b34801561025757600080fd5b5061021b6102663660046133e9565b6107f3565b34801561027757600080fd5b5061028b6102863660046132a3565b6108bf565b6040519081526020016101c2565b3480156102a557600080fd5b5061021b6102b43660046134bf565b6108d2565b3480156102c557600080fd5b5061021b6102d43660046134eb565b610936565b3480156102e557600080fd5b506102f96102f43660046132a3565b6109cb565b6040516101c29190613589565b34801561031257600080fd5b5061021b61032136600461361d565b610bd6565b34801561033257600080fd5b5061036f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c2919061364d565b34801561038857600080fd5b5061021b610ef0565b34801561039d57600080fd5b5061021b6103ac3660046136ac565b610fed565b3480156103bd57600080fd5b5061021b6103cc366004613718565b61134e565b3480156103dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561042957600080fd5b5061021b610438366004613753565b61165b565b34801561044957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103f8565b34801561047457600080fd5b5061021b610483366004613718565b6119f1565b34801561049457600080fd5b5061021b6104a33660046132a3565b611c38565b61028b6104b63660046138fb565b611ea2565b3480156104c757600080fd5b5061021b6104d63660046133e9565b6123d8565b3480156104e757600080fd5b506008546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105379085908590613a08565b9081526040519081900360200190205460ff1690509392505050565b61055b6123ec565b60085473ffffffffffffffffffffffffffffffffffffffff16156105bc576105bc61059b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff1690600061246f565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156106695761066961062960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61266f565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6003602052600090815260409020805481906106e290613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90613a18565b801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b50505050509080600101805461077090613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613a18565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905082565b6107fb6123ec565b73ffffffffffffffffffffffffffffffffffffffff8116610848576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006108cc600583612773565b92915050565b6108da6123ec565b6108e48282612786565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61093e6123ec565b61095f73ffffffffffffffffffffffffffffffffffffffff841683836128e0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109be91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a3a90613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690613a18565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600382018054610acc90613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890613a18565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bc85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b73565b505050915250909392505050565b610bde6123ec565b6001610beb600584612773565b14610c2a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c3a8260025b60059190612936565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c8290613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae90613a18565b8015610cfb5780601f10610cd057610100808354040283529160200191610cfb565b820191906000526020600020905b815481529060010190602001808311610cde57829003601f168201915b50505050508152602001600382018054610d1490613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090613a18565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610dbb565b5050505081525050905060005b816080015151811015610e9f57610e978383608001518381518110610e4457610e44613a6b565b60200260200101516020015184608001518481518110610e6657610e66613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128e09092919063ffffffff16565b600101610e1d565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c21565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ff56123ec565b60005b81811015611198576003600084848481811061101657611016613a6b565b90506020028101906110289190613a9a565b611036906020810190613406565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061106d5761106d613a6b565b905060200281019061107f9190613a9a565b61108d906020810190613ad8565b60405161109b929190613a08565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110e2576110e2613a6b565b90506020028101906110f49190613a9a565b611102906020810190613ad8565b604051611110929190613a08565b604051809103902083838381811061112a5761112a613a6b565b905060200281019061113c9190613a9a565b61114a906020810190613406565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611188911515815260200190565b60405180910390a3600101610ff8565b5060005b83811015611347576001600360008787858181106111bc576111bc613a6b565b90506020028101906111ce9190613a9a565b6111dc906020810190613406565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061121357611213613a6b565b90506020028101906112259190613a9a565b611233906020810190613ad8565b604051611241929190613a08565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061129157611291613a6b565b90506020028101906112a39190613a9a565b6112b1906020810190613ad8565b6040516112bf929190613a08565b60405180910390208585838181106112d9576112d9613a6b565b90506020028101906112eb9190613a9a565b6112f9906020810190613406565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611337911515815260200190565b60405180910390a360010161119c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113a1576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c21565b6113b16040820160208301613406565b6113be6040830183613ad8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061141592509050613a18565b1590508061146b5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516114569190613b3d565b9081526040519081900360200190205460ff16155b156114a457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c21919061364d565b6114b46040840160208501613406565b67ffffffffffffffff81166000908152600360205260409020805481906114da90613a18565b9050600003611521576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061155d908890600401613c51565b600060405180830381600087803b15801561157757600080fd5b505af1925050508015611588575060015b611628573d8080156115b6576040519150601f19603f3d011682016040523d82523d6000602084013e6115bb565b606091505b506115c886356001610c31565b508535600090815260046020526040902086906115e5828261402b565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061161a90849061364d565b60405180910390a250611347565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b6116636123ec565b60005b818110156119ec5782828281811061168057611680613a6b565b90506020028101906116929190614125565b6116a3906040810190602001614167565b61176f57600360008484848181106116bd576116bd613a6b565b90506020028101906116cf9190614125565b6116dd906020810190613406565b67ffffffffffffffff1681526020810191909152604001600090812061170291613255565b82828281811061171457611714613a6b565b90506020028101906117269190614125565b611734906020810190613406565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26119e4565b82828281811061178157611781613a6b565b90506020028101906117939190614125565b6117a1906040810190613ad8565b90506000036117dc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106117f4576117f4613a6b565b90506020028101906118069190614125565b611814906020810190613406565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061184a5761184a613a6b565b905060200281019061185c9190614125565b61186a906040810190613ad8565b8291611877919083613daf565b5083838381811061188a5761188a613a6b565b905060200281019061189c9190614125565b6118aa906060810190613ad8565b1590506118f5578383838181106118c3576118c3613a6b565b90506020028101906118d59190614125565b6118e3906060810190613ad8565b60018301916118f3919083613daf565b505b83838381811061190757611907613a6b565b90506020028101906119199190614125565b611927906040810190613ad8565b604051611935929190613a08565b604051809103902084848481811061194f5761194f613a6b565b90506020028101906119619190614125565b61196f906020810190613406565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106119ac576119ac613a6b565b90506020028101906119be9190614125565b6119cc906060810190613ad8565b6040516119da929190614184565b60405180910390a3505b600101611666565b505050565b333014611a2a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a396060830183613ad8565b810190611a469190614198565b9050600081604001516001811115611a6057611a606132bc565b03611a7257611a6e8261294b565b5050565b600181604001516001811115611a8a57611a8a6132bc565b03611a6e576000808260200151806020019051810190611aaa9190614244565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611af4919061364d565b6040516020818303038152906040528051906020012082604051602001611b1b919061364d565b6040516020818303038152906040528051906020012014611b68576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526009602052604090205460ff166002811115611b8d57611b8d6132bc565b03611bc7576040517f33704b2800000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505050565b6001611c45600583612773565b14611c7f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c21565b611c8a816000610c31565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cd290613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfe90613a18565b8015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b50505050508152602001600382018054611d6490613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9090613a18565b8015611ddd5780601f10611db257610100808354040283529160200191611ddd565b820191906000526020600020905b815481529060010190602001808311611dc057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e605760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611e0b565b50505050815250509050611e7381612cc1565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ecb90613a18565b9050600003611f12576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c21565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f4290613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6e90613a18565b8015611fbb5780601f10611f9057610100808354040283529160200191611fbb565b820191906000526020600020905b815481529060010190602001808311611f9e57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161201c90613a18565b80601f016020809104026020016040519081016040528092919081815260200182805461204890613a18565b80156120955780601f1061206a57610100808354040283529160200191612095565b820191906000526020600020905b81548152906001019060200180831161207857829003601f168201915b5050505050815250905060005b86518110156121f25761211233308984815181106120c2576120c2613a6b565b6020026020010151602001518a85815181106120e0576120e0613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612cc9909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061214257612142613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121ea5760025487516121ea9173ffffffffffffffffffffffffffffffffffffffff169089908490811061219b5761219b613a6b565b6020026020010151602001518984815181106121b9576121b9613a6b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661246f9092919063ffffffff16565b6001016120a2565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded9061224c908b9086906004016142c5565b602060405180830381865afa158015612269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228d9190614392565b60085490915073ffffffffffffffffffffffffffffffffffffffff16156122d3576008546122d39073ffffffffffffffffffffffffffffffffffffffff16333084612cc9565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612305576000612307565b825b8a856040518463ffffffff1660e01b81526004016123269291906142c5565b60206040518083038185885af1158015612344573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123699190614392565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6123e06123ec565b6123e981612d27565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c21565b565b80158061250f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614392565b155b61259b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119ec9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e1c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270a9190614392565b61271491906143ab565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061276d9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125ed565b50505050565b600061277f8383612f28565b9392505050565b804710156127f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c21565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461284a576040519150601f19603f3d011682016040523d82523d6000602084013e61284f565b606091505b50509050806119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c21565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526119ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125ed565b6000612943848484612fb2565b949350505050565b6040805160008082526020820190925281612988565b60408051808201909152600080825260208201528152602001906001900390816129615790505b50905060006040518060a001604052808480604001906129a89190613ad8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612a2992883591016143be565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612a99918901908901613406565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612ac990613a18565b80601f0160208091040260200160405190810160405280929190818152602001828054612af590613a18565b8015612b425780601f10612b1757610100808354040283529160200191612b42565b820191906000526020600020905b815481529060010190602001808311612b2557829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612b7f6040870160208801613406565b846040518363ffffffff1660e01b8152600401612b9d9291906142c5565b602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190614392565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612c16576000612c18565b835b612c286040890160208a01613406565b866040518463ffffffff1660e01b8152600401612c469291906142c5565b60206040518083038185885af1158015612c64573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c899190614392565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b6123e96123ec565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261276d9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016125ed565b3373ffffffffffffffffffffffffffffffffffffffff821603612da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c21565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612e7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b8051909150156119ec5780806020019051810190612e9c91906143e0565b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c21565b600081815260028301602052604081205480151580612f4c5750612f4c8484612fde565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c21565b600082815260028401602052604081208290556129438484612fea565b60606129438484600085612ff6565b600061277f838361310f565b600061277f8383613127565b606082471015613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c21565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130b19190613b3d565b60006040518083038185875af1925050503d80600081146130ee576040519150601f19603f3d011682016040523d82523d6000602084013e6130f3565b606091505b509150915061310487838387613176565b979650505050505050565b6000818152600183016020526040812054151561277f565b600081815260018301602052604081205461316e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108cc565b5060006108cc565b6060831561320c5782516000036132055773ffffffffffffffffffffffffffffffffffffffff85163b613205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c21565b5081612943565b61294383838151156132215781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c21919061364d565b50805461326190613a18565b6000825580601f10613271575050565b601f0160209004906000526020600020908101906123e991905b8082111561329f576000815560010161328b565b5090565b6000602082840312156132b557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613326577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146123e957600080fd5b60008060006040848603121561335757600080fd5b83356133628161332c565b9250602084013567ffffffffffffffff8082111561337f57600080fd5b818601915086601f83011261339357600080fd5b8135818111156133a257600080fd5b8760208285010111156133b457600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146123e957600080fd5b6000602082840312156133fb57600080fd5b813561277f816133c7565b60006020828403121561341857600080fd5b813561277f8161332c565b60005b8381101561343e578181015183820152602001613426565b50506000910152565b6000815180845261345f816020860160208601613423565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006134a46040830185613447565b82810360208401526134b68185613447565b95945050505050565b600080604083850312156134d257600080fd5b82356134dd816133c7565b946020939093013593505050565b60008060006060848603121561350057600080fd5b833561350b816133c7565b9250602084013561351b816133c7565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561357e578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613541565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135c360c0840182613447565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526135ff8383613447565b925060808601519150808584030160a0860152506134b6828261352c565b6000806040838503121561363057600080fd5b823591506020830135613642816133c7565b809150509250929050565b60208152600061277f6020830184613447565b60008083601f84011261367257600080fd5b50813567ffffffffffffffff81111561368a57600080fd5b6020830191508360208260051b85010111156136a557600080fd5b9250929050565b600080600080604085870312156136c257600080fd5b843567ffffffffffffffff808211156136da57600080fd5b6136e688838901613660565b909650945060208701359150808211156136ff57600080fd5b5061370c87828801613660565b95989497509550505050565b60006020828403121561372a57600080fd5b813567ffffffffffffffff81111561374157600080fd5b820160a0818503121561277f57600080fd5b6000806020838503121561376657600080fd5b823567ffffffffffffffff81111561377d57600080fd5b61378985828601613660565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156137e7576137e7613795565b60405290565b6040516060810167ffffffffffffffff811182821017156137e7576137e7613795565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385757613857613795565b604052919050565b600067ffffffffffffffff82111561387957613879613795565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126138b657600080fd5b81356138c96138c48261385f565b613810565b8181528460208386010111156138de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561391057600080fd5b833561391b8161332c565b925060208481013567ffffffffffffffff8082111561393957600080fd5b818701915087601f83011261394d57600080fd5b81358181111561395f5761395f613795565b61396d848260051b01613810565b81815260069190911b8301840190848101908a83111561398c57600080fd5b938501935b828510156139d8576040858c0312156139aa5760008081fd5b6139b26137c4565b85356139bd816133c7565b81528587013587820152825260409094019390850190613991565b9650505060408701359250808311156139f057600080fd5b50506139fe868287016138a5565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a2c57607f821691505b602082108103613a65577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613ace57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b0d57600080fd5b83018035915067ffffffffffffffff821115613b2857600080fd5b6020019150368190038213156136a557600080fd5b60008251613ace818460208701613423565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b8457600080fd5b830160208101925035905067ffffffffffffffff811115613ba457600080fd5b8036038213156136a557600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561357e578135613c1f816133c7565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613c0c565b602081528135602082015260006020830135613c6c8161332c565b67ffffffffffffffff8082166040850152613c8a6040860186613b4f565b925060a06060860152613ca160c086018483613bb3565b925050613cb16060860186613b4f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613ce7858385613bb3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613d2057600080fd5b60209288019283019235915083821115613d3957600080fd5b8160061b3603831315613d4b57600080fd5b8685030160a0870152613104848284613bfc565b601f8211156119ec576000816000526020600020601f850160051c81016020861015613d885750805b601f850160051c820191505b81811015613da757828155600101613d94565b505050505050565b67ffffffffffffffff831115613dc757613dc7613795565b613ddb83613dd58354613a18565b83613d5f565b6000601f841160018114613e2d5760008515613df75750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611347565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613e7c5786850135825560209485019460019092019101613e5c565b5086821015613eb7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613f03816133c7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613f6957613f69613795565b805483825580841015613ff65760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613faa57613faa613ec9565b8086168614613fbb57613fbb613ec9565b5060008360005260206000208360011b81018760011b820191505b80821015613ff1578282558284830155600282019150613fd6565b505050505b5060008181526020812083915b85811015613da7576140158383613ef8565b6040929092019160029190910190600101614003565b813581556001810160208301356140418161332c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556140816040860186613ad8565b93509150614093838360028701613daf565b6140a06060860186613ad8565b935091506140b2838360038701613daf565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126140e957600080fd5b9184019182359150808211156140fe57600080fd5b506020820191508060061b360382131561411757600080fd5b61276d818360048601613f50565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ace57600080fd5b80151581146123e957600080fd5b60006020828403121561417957600080fd5b813561277f81614159565b602081526000612943602083018486613bb3565b6000602082840312156141aa57600080fd5b813567ffffffffffffffff808211156141c257600080fd5b90830190606082860312156141d657600080fd5b6141de6137ed565b8235828111156141ed57600080fd5b6141f9878286016138a5565b82525060208301358281111561420e57600080fd5b61421a878286016138a5565b602083015250604083013592506002831061423457600080fd5b6040810192909252509392505050565b6000806040838503121561425757600080fd5b825167ffffffffffffffff81111561426e57600080fd5b8301601f8101851361427f57600080fd5b805161428d6138c48261385f565b8181528660208385010111156142a257600080fd5b6142b3826020830160208601613423565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a060408401526142f160e0840182613447565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261432d8383613447565b9250604086015191508085840301608086015261434a838361352c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143888282613447565b9695505050505050565b6000602082840312156143a457600080fd5b5051919050565b808201808211156108cc576108cc613ec9565b6040815260006143d16040830185613447565b90508260208301529392505050565b6000602082840312156143f257600080fd5b815161277f8161415956fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162003bf038038062003bf08339810160408190526200003491620001e8565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000124565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600880549490921693169290921790915550620002279050565b336001600160a01b038216036200017e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620001e557600080fd5b50565b60008060408385031215620001fc57600080fd5b82516200020981620001cf565b60208401519092506200021c81620001cf565b809150509250929050565b6139b980620002376000396000f3fe6080604052600436106101485760003560e01c806385572ffb116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103c0578063f2fde38b146103d3578063ff2deec3146103f357600080fd5b8063cf6730f814610380578063e4ca8754146103a057600080fd5b80639fe74e26116100a55780639fe74e2614610315578063b0f479a114610335578063c851cc321461036057600080fd5b806385572ffb146102a95780638da5cb5b146102c957600080fd5b80635e35359e116101175780636d62d633116100fc5780636d62d6331461025457806379ba5097146102745780638462a2b91461028957600080fd5b80635e35359e146102075780636939cd971461022757600080fd5b80630e958d6b1461015457806335f170ef146101895780635075a9d4146101b7578063536c6bfa146101e557600080fd5b3661014f57005b600080fd5b34801561016057600080fd5b5061017461016f366004612a73565b610420565b60405190151581526020015b60405180910390f35b34801561019557600080fd5b506101a96101a4366004612af8565b61046b565b604051610180929190612b83565b3480156101c357600080fd5b506101d76101d2366004612bb1565b610597565b604051908152602001610180565b3480156101f157600080fd5b50610205610200366004612bec565b6105aa565b005b34801561021357600080fd5b50610205610222366004612c18565b61060e565b34801561023357600080fd5b50610247610242366004612bb1565b6106a3565b6040516101809190612cb6565b34801561026057600080fd5b5061020561026f366004612d4a565b6108ae565b34801561028057600080fd5b50610205610bc8565b34801561029557600080fd5b506102056102a4366004612dc6565b610cc5565b3480156102b557600080fd5b506102056102c4366004612e32565b611006565b3480156102d557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610180565b34801561032157600080fd5b50610205610330366004612e6d565b61120f565b34801561034157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102f0565b34801561036c57600080fd5b5061020561037b366004612eaf565b6115a0565b34801561038c57600080fd5b5061020561039b366004612e32565b61166c565b3480156103ac57600080fd5b506102056103bb366004612bb1565b611825565b6101d76103ce366004613001565b611a8f565b3480156103df57600080fd5b506102056103ee366004612eaf565b611f9c565b3480156103ff57600080fd5b506008546102f09073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061044f908590859061310e565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104869061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b29061311e565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050908060010180546105149061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546105409061311e565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050905082565b60006105a4600583611fb0565b92915050565b6105b2611fc3565b6105bc8282612046565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610616611fc3565b61063773ffffffffffffffffffffffffffffffffffffffff841683836121a0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161069691815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107129061311e565b80601f016020809104026020016040519081016040528092919081815260200182805461073e9061311e565b801561078b5780601f106107605761010080835404028352916020019161078b565b820191906000526020600020905b81548152906001019060200180831161076e57829003601f168201915b505050505081526020016003820180546107a49061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546107d09061311e565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108a05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161084b565b505050915250909392505050565b6108b6611fc3565b60016108c3600584611fb0565b14610902576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109128260025b60059190612274565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161095a9061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546109869061311e565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b505050505081526020016003820180546109ec9061311e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a189061311e565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610ae85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a93565b5050505081525050905060005b816080015151811015610b7757610b6f8383608001518381518110610b1c57610b1c613171565b60200260200101516020015184608001518481518110610b3e57610b3e613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166121a09092919063ffffffff16565b600101610af5565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108f9565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ccd611fc3565b60005b81811015610e605760036000848484818110610cee57610cee613171565b9050602002810190610d0091906131a0565b610d0e906020810190612af8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d4557610d45613171565b9050602002810190610d5791906131a0565b610d659060208101906131de565b604051610d7392919061310e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610dba57610dba613171565b9050602002810190610dcc91906131a0565b610dda9060208101906131de565b604051610de892919061310e565b6040518091039020838383818110610e0257610e02613171565b9050602002810190610e1491906131a0565b610e22906020810190612af8565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610cd0565b5060005b83811015610fff57600160036000878785818110610e8457610e84613171565b9050602002810190610e9691906131a0565b610ea4906020810190612af8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610edb57610edb613171565b9050602002810190610eed91906131a0565b610efb9060208101906131de565b604051610f0992919061310e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f5957610f59613171565b9050602002810190610f6b91906131a0565b610f799060208101906131de565b604051610f8792919061310e565b6040518091039020858583818110610fa157610fa1613171565b9050602002810190610fb391906131a0565b610fc1906020810190612af8565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e64565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611059576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108f9565b6110696040820160208301612af8565b67ffffffffffffffff811660009081526003602052604090208054819061108f9061311e565b90506000036110d6576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108f9565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611112908690600401613345565b600060405180830381600087803b15801561112c57600080fd5b505af192505050801561113d575060015b6111dd573d80801561116b576040519150601f19603f3d011682016040523d82523d6000602084013e611170565b606091505b5061117d84356001610909565b5083356000908152600460205260409020849061119a8282613717565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906111cf908490613811565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611217611fc3565b60005b8181101561120a5782828281811061123457611234613171565b90506020028101906112469190613824565b611257906040810190602001613866565b611323576003600084848481811061127157611271613171565b90506020028101906112839190613824565b611291906020810190612af8565b67ffffffffffffffff168152602081019190915260400160009081206112b691612a0f565b8282828181106112c8576112c8613171565b90506020028101906112da9190613824565b6112e8906020810190612af8565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611598565b82828281811061133557611335613171565b90506020028101906113479190613824565b6113559060408101906131de565b9050600003611390576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113a8576113a8613171565b90506020028101906113ba9190613824565b6113c8906020810190612af8565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106113fe576113fe613171565b90506020028101906114109190613824565b61141e9060408101906131de565b829161142b9190836134a3565b5083838381811061143e5761143e613171565b90506020028101906114509190613824565b61145e9060608101906131de565b1590506114a95783838381811061147757611477613171565b90506020028101906114899190613824565b6114979060608101906131de565b60018301916114a79190836134a3565b505b8383838181106114bb576114bb613171565b90506020028101906114cd9190613824565b6114db9060408101906131de565b6040516114e992919061310e565b604051809103902084848481811061150357611503613171565b90506020028101906115159190613824565b611523906020810190612af8565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061156057611560613171565b90506020028101906115729190613824565b6115809060608101906131de565b60405161158e929190613883565b60405180910390a3505b60010161121a565b6115a8611fc3565b73ffffffffffffffffffffffffffffffffffffffff81166115f5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146116a5576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b56040820160208301612af8565b6116c260408301836131de565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506117199250905061311e565b1590508061176f5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161175a9190613897565b9081526040519081900360200190205460ff16155b156117a857806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108f99190613811565b6117b86040840160208501612af8565b67ffffffffffffffff81166000908152600360205260409020805481906117de9061311e565b9050600003610fff576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108f9565b6001611832600583611fb0565b1461186c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108f9565b611877816000610909565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916118bf9061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb9061311e565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b505050505081526020016003820180546119519061311e565b80601f016020809104026020016040519081016040528092919081815260200182805461197d9061311e565b80156119ca5780601f1061199f576101008083540402835291602001916119ca565b820191906000526020600020905b8154815290600101906020018083116119ad57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611a4d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016119f8565b50505050815250509050611a6081612289565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ab89061311e565b9050600003611aff576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108f9565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611b2f9061311e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5b9061311e565b8015611ba85780601f10611b7d57610100808354040283529160200191611ba8565b820191906000526020600020905b815481529060010190602001808311611b8b57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611c099061311e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c359061311e565b8015611c825780601f10611c5757610100808354040283529160200191611c82565b820191906000526020600020905b815481529060010190602001808311611c6557829003601f168201915b5050505050815250905060005b8651811015611ddf57611cff3330898481518110611caf57611caf613171565b6020026020010151602001518a8581518110611ccd57611ccd613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122fb909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611d2f57611d2f613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611dd7576002548751611dd79173ffffffffffffffffffffffffffffffffffffffff1690899084908110611d8857611d88613171565b602002602001015160200151898481518110611da657611da6613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661235f9092919063ffffffff16565b600101611c8f565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611e39908b9086906004016138a9565b602060405180830381865afa158015611e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7a9190613976565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615611ec057600854611ec09073ffffffffffffffffffffffffffffffffffffffff163330846122fb565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611ef2576000611ef4565b825b8a856040518463ffffffff1660e01b8152600401611f139291906138a9565b60206040518083038185885af1158015611f31573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f569190613976565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611f8991815260200190565b60405180910390a1505050509392505050565b611fa4611fc3565b611fad816124e1565b50565b6000611fbc83836125d6565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108f9565b565b804710156120b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108f9565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461210a576040519150601f19603f3d011682016040523d82523d6000602084013e61210f565b606091505b505090508061120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108f9565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261120a9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612660565b600061228184848461276c565b949350505050565b612291611fc3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906122cd908490600401612cb6565b600060405180830381600087803b1580156122e757600080fd5b505af1158015610fff573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123599085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016121f2565b50505050565b8015806123ff57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd9190613976565b155b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108f9565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261120a9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016121f2565b3373ffffffffffffffffffffffffffffffffffffffff821603612560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108f9565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806125fa57506125fa8484612789565b611fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108f9565b60006126c2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127959092919063ffffffff16565b80519091501561120a57808060200190518101906126e0919061398f565b61120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108f9565b6000828152600284016020526040812082905561228184846127a4565b6000611fbc83836127b0565b606061228184846000856127c8565b6000611fbc83836128e1565b60008181526001830160205260408120541515611fbc565b60608247101561285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108f9565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128839190613897565b60006040518083038185875af1925050503d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b50915091506128d687838387612930565b979650505050505050565b6000818152600183016020526040812054612928575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105a4565b5060006105a4565b606083156129c65782516000036129bf5773ffffffffffffffffffffffffffffffffffffffff85163b6129bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108f9565b5081612281565b61228183838151156129db5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f99190613811565b508054612a1b9061311e565b6000825580601f10612a2b575050565b601f016020900490600052602060002090810190611fad91905b80821115612a595760008155600101612a45565b5090565b67ffffffffffffffff81168114611fad57600080fd5b600080600060408486031215612a8857600080fd5b8335612a9381612a5d565b9250602084013567ffffffffffffffff80821115612ab057600080fd5b818601915086601f830112612ac457600080fd5b813581811115612ad357600080fd5b876020828501011115612ae557600080fd5b6020830194508093505050509250925092565b600060208284031215612b0a57600080fd5b8135611fbc81612a5d565b60005b83811015612b30578181015183820152602001612b18565b50506000910152565b60008151808452612b51816020860160208601612b15565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612b966040830185612b39565b8281036020840152612ba88185612b39565b95945050505050565b600060208284031215612bc357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611fad57600080fd5b60008060408385031215612bff57600080fd5b8235612c0a81612bca565b946020939093013593505050565b600080600060608486031215612c2d57600080fd5b8335612c3881612bca565b92506020840135612c4881612bca565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612cab578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612c6e565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612cf060c0840182612b39565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d2c8383612b39565b925060808601519150808584030160a086015250612ba88282612c59565b60008060408385031215612d5d57600080fd5b823591506020830135612d6f81612bca565b809150509250929050565b60008083601f840112612d8c57600080fd5b50813567ffffffffffffffff811115612da457600080fd5b6020830191508360208260051b8501011115612dbf57600080fd5b9250929050565b60008060008060408587031215612ddc57600080fd5b843567ffffffffffffffff80821115612df457600080fd5b612e0088838901612d7a565b90965094506020870135915080821115612e1957600080fd5b50612e2687828801612d7a565b95989497509550505050565b600060208284031215612e4457600080fd5b813567ffffffffffffffff811115612e5b57600080fd5b820160a08185031215611fbc57600080fd5b60008060208385031215612e8057600080fd5b823567ffffffffffffffff811115612e9757600080fd5b612ea385828601612d7a565b90969095509350505050565b600060208284031215612ec157600080fd5b8135611fbc81612bca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f1e57612f1e612ecc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f6b57612f6b612ecc565b604052919050565b600082601f830112612f8457600080fd5b813567ffffffffffffffff811115612f9e57612f9e612ecc565b612fcf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f24565b818152846020838601011115612fe457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561301657600080fd5b833561302181612a5d565b925060208481013567ffffffffffffffff8082111561303f57600080fd5b818701915087601f83011261305357600080fd5b81358181111561306557613065612ecc565b613073848260051b01612f24565b81815260069190911b8301840190848101908a83111561309257600080fd5b938501935b828510156130de576040858c0312156130b05760008081fd5b6130b8612efb565b85356130c381612bca565b81528587013587820152825260409094019390850190613097565b9650505060408701359250808311156130f657600080fd5b505061310486828701612f73565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061313257607f821691505b60208210810361316b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126131d457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261321357600080fd5b83018035915067ffffffffffffffff82111561322e57600080fd5b602001915036819003821315612dbf57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261327857600080fd5b830160208101925035905067ffffffffffffffff81111561329857600080fd5b803603821315612dbf57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612cab57813561331381612bca565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613300565b60208152813560208201526000602083013561336081612a5d565b67ffffffffffffffff808216604085015261337e6040860186613243565b925060a0606086015261339560c0860184836132a7565b9250506133a56060860186613243565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526133db8583856132a7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261341457600080fd5b6020928801928301923591508382111561342d57600080fd5b8160061b360383131561343f57600080fd5b8685030160a08701526128d68482846132f0565b601f82111561120a576000816000526020600020601f850160051c8101602086101561347c5750805b601f850160051c820191505b8181101561349b57828155600101613488565b505050505050565b67ffffffffffffffff8311156134bb576134bb612ecc565b6134cf836134c9835461311e565b83613453565b6000601f84116001811461352157600085156134eb5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fff565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135705786850135825560209485019460019092019101613550565b50868210156135ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461361a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561362a81612bca565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561369057613690612ecc565b8054838255808410156136e2576136a6816135bd565b6136af856135bd565b6000848152602081209283019291909101905b828210156136de578082558060018301556002820191506136c2565b5050505b5060008181526020812083915b8581101561349b57613701838361361f565b60409290920191600291909101906001016136ef565b8135815560018101602083013561372d81612a5d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561376d60408601866131de565b9350915061377f8383600287016134a3565b61378c60608601866131de565b9350915061379e8383600387016134a3565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126137d557600080fd5b9184019182359150808211156137ea57600080fd5b506020820191508060061b360382131561380357600080fd5b612359818360048601613677565b602081526000611fbc6020830184612b39565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126131d457600080fd5b8015158114611fad57600080fd5b60006020828403121561387857600080fd5b8135611fbc81613858565b6020815260006122816020830184866132a7565b600082516131d4818460208701612b15565b67ffffffffffffffff83168152604060208201526000825160a060408401526138d560e0840182612b39565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526139118383612b39565b9250604086015191508085840301608086015261392e8383612c59565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061396c8282612b39565b9695505050505050565b60006020828403121561398857600080fd5b5051919050565b6000602082840312156139a157600080fd5b8151611fbc8161385856fea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -196,28 +196,6 @@ func (_CCIPClient *CCIPClientTransactorRaw) Transact(opts *bind.TransactOpts, me return _CCIPClient.Contract.contract.Transact(opts, method, params...) } -func (_CCIPClient *CCIPClientCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -func (_CCIPClient *CCIPClientSession) ACKMESSAGEHEADER() (string, error) { - return _CCIPClient.Contract.ACKMESSAGEHEADER(&_CCIPClient.CallOpts) -} - -func (_CCIPClient *CCIPClientCallerSession) ACKMESSAGEHEADER() (string, error) { - return _CCIPClient.Contract.ACKMESSAGEHEADER(&_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) @@ -380,28 +358,6 @@ 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 *CCIPClientTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -462,30 +418,6 @@ func (_CCIPClient *CCIPClientTransactorSession) CcipSend(destChainSelector uint6 return _CCIPClient.Contract.CcipSend(&_CCIPClient.TransactOpts, destChainSelector, tokenAmounts, data) } -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) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "modifyRouter", newRouter) -} - -func (_CCIPClient *CCIPClientSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.ModifyRouter(&_CCIPClient.TransactOpts, newRouter) -} - -func (_CCIPClient *CCIPClientTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _CCIPClient.Contract.ModifyRouter(&_CCIPClient.TransactOpts, newRouter) -} - func (_CCIPClient *CCIPClientTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "processMessage", message) } @@ -534,6 +466,18 @@ func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCI return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) } +func (_CCIPClient *CCIPClientTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_CCIPClient *CCIPClientSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateRouter(&_CCIPClient.TransactOpts, newRouter) +} + +func (_CCIPClient *CCIPClientTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateRouter(&_CCIPClient.TransactOpts, newRouter) +} + func (_CCIPClient *CCIPClientTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "withdrawNativeToken", to, amount) } @@ -570,8 +514,8 @@ func (_CCIPClient *CCIPClientTransactorSession) Receive() (*types.Transaction, e return _CCIPClient.Contract.Receive(&_CCIPClient.TransactOpts) } -type CCIPClientApprovedSenderModifiedIterator struct { - Event *CCIPClientApprovedSenderModified +type CCIPClientApprovedSenderAddedIterator struct { + Event *CCIPClientApprovedSenderAdded contract *bind.BoundContract event string @@ -582,7 +526,7 @@ type CCIPClientApprovedSenderModifiedIterator struct { fail error } -func (it *CCIPClientApprovedSenderModifiedIterator) Next() bool { +func (it *CCIPClientApprovedSenderAddedIterator) Next() bool { if it.fail != nil { return false @@ -591,7 +535,7 @@ func (it *CCIPClientApprovedSenderModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPClientApprovedSenderModified) + it.Event = new(CCIPClientApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -606,7 +550,7 @@ func (it *CCIPClientApprovedSenderModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPClientApprovedSenderModified) + it.Event = new(CCIPClientApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -621,23 +565,22 @@ func (it *CCIPClientApprovedSenderModifiedIterator) Next() bool { } } -func (it *CCIPClientApprovedSenderModifiedIterator) Error() error { +func (it *CCIPClientApprovedSenderAddedIterator) Error() error { return it.fail } -func (it *CCIPClientApprovedSenderModifiedIterator) Close() error { +func (it *CCIPClientApprovedSenderAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPClientApprovedSenderModified struct { +type CCIPClientApprovedSenderAdded struct { DestChainSelector uint64 Recipient common.Hash - IsBeingApproved bool Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderModifiedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderAddedIterator, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -648,14 +591,14 @@ func (_CCIPClient *CCIPClientFilterer) FilterApprovedSenderModified(opts *bind.F recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPClientApprovedSenderModifiedIterator{contract: _CCIPClient.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil + return &CCIPClientApprovedSenderAddedIterator{contract: _CCIPClient.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -666,7 +609,7 @@ func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderModified(opts *bind.Wa recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -676,8 +619,8 @@ func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderModified(opts *bind.Wa select { case log := <-logs: - event := new(CCIPClientApprovedSenderModified) - if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + event := new(CCIPClientApprovedSenderAdded) + if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return err } event.Raw = log @@ -698,17 +641,17 @@ func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderModified(opts *bind.Wa }), nil } -func (_CCIPClient *CCIPClientFilterer) ParseApprovedSenderModified(log types.Log) (*CCIPClientApprovedSenderModified, error) { - event := new(CCIPClientApprovedSenderModified) - if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { +func (_CCIPClient *CCIPClientFilterer) ParseApprovedSenderAdded(log types.Log) (*CCIPClientApprovedSenderAdded, error) { + event := new(CCIPClientApprovedSenderAdded) + if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPClientCCIPRouterModifiedIterator struct { - Event *CCIPClientCCIPRouterModified +type CCIPClientApprovedSenderRemovedIterator struct { + Event *CCIPClientApprovedSenderRemoved contract *bind.BoundContract event string @@ -719,7 +662,7 @@ type CCIPClientCCIPRouterModifiedIterator struct { fail error } -func (it *CCIPClientCCIPRouterModifiedIterator) Next() bool { +func (it *CCIPClientApprovedSenderRemovedIterator) Next() bool { if it.fail != nil { return false @@ -728,7 +671,7 @@ func (it *CCIPClientCCIPRouterModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPClientCCIPRouterModified) + it.Event = new(CCIPClientApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -743,7 +686,7 @@ func (it *CCIPClientCCIPRouterModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPClientCCIPRouterModified) + it.Event = new(CCIPClientApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -758,51 +701,51 @@ func (it *CCIPClientCCIPRouterModifiedIterator) Next() bool { } } -func (it *CCIPClientCCIPRouterModifiedIterator) Error() error { +func (it *CCIPClientApprovedSenderRemovedIterator) Error() error { return it.fail } -func (it *CCIPClientCCIPRouterModifiedIterator) Close() error { +func (it *CCIPClientApprovedSenderRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPClientCCIPRouterModified struct { - OldRouter common.Address - NewRouter common.Address - Raw types.Log +type CCIPClientApprovedSenderRemoved struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientCCIPRouterModifiedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderRemovedIterator, error) { - var oldRouterRule []interface{} - for _, oldRouterItem := range oldRouter { - oldRouterRule = append(oldRouterRule, oldRouterItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) } - var newRouterRule []interface{} - for _, newRouterItem := range newRouter { - newRouterRule = append(newRouterRule, newRouterItem) + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPClientCCIPRouterModifiedIterator{contract: _CCIPClient.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil + return &CCIPClientApprovedSenderRemovedIterator{contract: _CCIPClient.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPClientCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - var oldRouterRule []interface{} - for _, oldRouterItem := range oldRouter { - oldRouterRule = append(oldRouterRule, oldRouterItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) } - var newRouterRule []interface{} - for _, newRouterItem := range newRouter { - newRouterRule = append(newRouterRule, newRouterItem) + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -812,8 +755,8 @@ func (_CCIPClient *CCIPClientFilterer) WatchCCIPRouterModified(opts *bind.WatchO select { case log := <-logs: - event := new(CCIPClientCCIPRouterModified) - if err := _CCIPClient.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { + event := new(CCIPClientApprovedSenderRemoved) + if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return err } event.Raw = log @@ -834,17 +777,17 @@ func (_CCIPClient *CCIPClientFilterer) WatchCCIPRouterModified(opts *bind.WatchO }), nil } -func (_CCIPClient *CCIPClientFilterer) ParseCCIPRouterModified(log types.Log) (*CCIPClientCCIPRouterModified, error) { - event := new(CCIPClientCCIPRouterModified) - if err := _CCIPClient.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { +func (_CCIPClient *CCIPClientFilterer) ParseApprovedSenderRemoved(log types.Log) (*CCIPClientApprovedSenderRemoved, error) { + event := new(CCIPClientApprovedSenderRemoved) + if err := _CCIPClient.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPClientChainAddedIterator struct { - Event *CCIPClientChainAdded +type CCIPClientCCIPRouterModifiedIterator struct { + Event *CCIPClientCCIPRouterModified contract *bind.BoundContract event string @@ -855,7 +798,7 @@ type CCIPClientChainAddedIterator struct { fail error } -func (it *CCIPClientChainAddedIterator) Next() bool { +func (it *CCIPClientCCIPRouterModifiedIterator) Next() bool { if it.fail != nil { return false @@ -864,7 +807,7 @@ func (it *CCIPClientChainAddedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPClientChainAdded) + it.Event = new(CCIPClientCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -879,7 +822,7 @@ func (it *CCIPClientChainAddedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPClientChainAdded) + it.Event = new(CCIPClientCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -894,52 +837,51 @@ func (it *CCIPClientChainAddedIterator) Next() bool { } } -func (it *CCIPClientChainAddedIterator) Error() error { +func (it *CCIPClientCCIPRouterModifiedIterator) Error() error { return it.fail } -func (it *CCIPClientChainAddedIterator) Close() error { +func (it *CCIPClientCCIPRouterModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPClientChainAdded struct { - RemoteChainSelector uint64 - Recipient common.Hash - ExtraArgsBytes []byte - Raw types.Log +type CCIPClientCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPClientChainAddedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientCCIPRouterModifiedIterator, error) { - var remoteChainSelectorRule []interface{} - for _, remoteChainSelectorItem := range remoteChainSelector { - remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) } - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) } - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } - return &CCIPClientChainAddedIterator{contract: _CCIPClient.contract, event: "ChainAdded", logs: logs, sub: sub}, nil + return &CCIPClientCCIPRouterModifiedIterator{contract: _CCIPClient.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPClientCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { - var remoteChainSelectorRule []interface{} - for _, remoteChainSelectorItem := range remoteChainSelector { - remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) } - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } @@ -949,8 +891,8 @@ func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sin select { case log := <-logs: - event := new(CCIPClientChainAdded) - if err := _CCIPClient.contract.UnpackLog(event, "ChainAdded", log); err != nil { + event := new(CCIPClientCCIPRouterModified) + if err := _CCIPClient.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return err } event.Raw = log @@ -971,17 +913,17 @@ func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sin }), nil } -func (_CCIPClient *CCIPClientFilterer) ParseChainAdded(log types.Log) (*CCIPClientChainAdded, error) { - event := new(CCIPClientChainAdded) - if err := _CCIPClient.contract.UnpackLog(event, "ChainAdded", log); err != nil { +func (_CCIPClient *CCIPClientFilterer) ParseCCIPRouterModified(log types.Log) (*CCIPClientCCIPRouterModified, error) { + event := new(CCIPClientCCIPRouterModified) + if err := _CCIPClient.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPClientChainRemovedIterator struct { - Event *CCIPClientChainRemoved +type CCIPClientChainAddedIterator struct { + Event *CCIPClientChainAdded contract *bind.BoundContract event string @@ -992,7 +934,7 @@ type CCIPClientChainRemovedIterator struct { fail error } -func (it *CCIPClientChainRemovedIterator) Next() bool { +func (it *CCIPClientChainAddedIterator) Next() bool { if it.fail != nil { return false @@ -1001,7 +943,7 @@ func (it *CCIPClientChainRemovedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPClientChainRemoved) + it.Event = new(CCIPClientChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1016,7 +958,7 @@ func (it *CCIPClientChainRemovedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPClientChainRemoved) + it.Event = new(CCIPClientChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1031,42 +973,52 @@ func (it *CCIPClientChainRemovedIterator) Next() bool { } } -func (it *CCIPClientChainRemovedIterator) Error() error { +func (it *CCIPClientChainAddedIterator) Error() error { return it.fail } -func (it *CCIPClientChainRemovedIterator) Close() error { +func (it *CCIPClientChainAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPClientChainRemoved struct { - RemoveChainSelector uint64 +type CCIPClientChainAdded struct { + RemoteChainSelector uint64 + Recipient common.Hash + ExtraArgsBytes []byte Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPClientChainRemovedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPClientChainAddedIterator, error) { - var removeChainSelectorRule []interface{} - for _, removeChainSelectorItem := range removeChainSelector { - removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPClientChainRemovedIterator{contract: _CCIPClient.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil + return &CCIPClientChainAddedIterator{contract: _CCIPClient.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - var removeChainSelectorRule []interface{} - for _, removeChainSelectorItem := range removeChainSelector { - removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -1076,8 +1028,8 @@ func (_CCIPClient *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, s select { case log := <-logs: - event := new(CCIPClientChainRemoved) - if err := _CCIPClient.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + event := new(CCIPClientChainAdded) + if err := _CCIPClient.contract.UnpackLog(event, "ChainAdded", log); err != nil { return err } event.Raw = log @@ -1098,17 +1050,17 @@ func (_CCIPClient *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, s }), nil } -func (_CCIPClient *CCIPClientFilterer) ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, error) { - event := new(CCIPClientChainRemoved) - if err := _CCIPClient.contract.UnpackLog(event, "ChainRemoved", log); err != nil { +func (_CCIPClient *CCIPClientFilterer) ParseChainAdded(log types.Log) (*CCIPClientChainAdded, error) { + event := new(CCIPClientChainAdded) + if err := _CCIPClient.contract.UnpackLog(event, "ChainAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPClientFeeTokenModifiedIterator struct { - Event *CCIPClientFeeTokenModified +type CCIPClientChainRemovedIterator struct { + Event *CCIPClientChainRemoved contract *bind.BoundContract event string @@ -1119,7 +1071,7 @@ type CCIPClientFeeTokenModifiedIterator struct { fail error } -func (it *CCIPClientFeeTokenModifiedIterator) Next() bool { +func (it *CCIPClientChainRemovedIterator) Next() bool { if it.fail != nil { return false @@ -1128,7 +1080,7 @@ func (it *CCIPClientFeeTokenModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPClientFeeTokenModified) + it.Event = new(CCIPClientChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1143,7 +1095,7 @@ func (it *CCIPClientFeeTokenModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPClientFeeTokenModified) + it.Event = new(CCIPClientChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1158,51 +1110,42 @@ func (it *CCIPClientFeeTokenModifiedIterator) Next() bool { } } -func (it *CCIPClientFeeTokenModifiedIterator) Error() error { +func (it *CCIPClientChainRemovedIterator) Error() error { return it.fail } -func (it *CCIPClientFeeTokenModifiedIterator) Close() error { +func (it *CCIPClientChainRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPClientFeeTokenModified struct { - OldToken common.Address - NewToken common.Address - Raw types.Log +type CCIPClientChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPClientFeeTokenModifiedIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPClientChainRemovedIterator, error) { - var oldTokenRule []interface{} - for _, oldTokenItem := range oldToken { - oldTokenRule = append(oldTokenRule, oldTokenItem) - } - var newTokenRule []interface{} - for _, newTokenItem := range newToken { - newTokenRule = append(newTokenRule, newTokenItem) + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) } - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } - return &CCIPClientFeeTokenModifiedIterator{contract: _CCIPClient.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil + return &CCIPClientChainRemovedIterator{contract: _CCIPClient.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_CCIPClient *CCIPClientFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPClientFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { +func (_CCIPClient *CCIPClientFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientChainRemoved, removeChainSelector []uint64) (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) + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) } - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -1212,8 +1155,8 @@ func (_CCIPClient *CCIPClientFilterer) WatchFeeTokenModified(opts *bind.WatchOpt select { case log := <-logs: - event := new(CCIPClientFeeTokenModified) - if err := _CCIPClient.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + event := new(CCIPClientChainRemoved) + if err := _CCIPClient.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return err } event.Raw = log @@ -1234,9 +1177,9 @@ func (_CCIPClient *CCIPClientFilterer) WatchFeeTokenModified(opts *bind.WatchOpt }), nil } -func (_CCIPClient *CCIPClientFilterer) ParseFeeTokenModified(log types.Log) (*CCIPClientFeeTokenModified, error) { - event := new(CCIPClientFeeTokenModified) - if err := _CCIPClient.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { +func (_CCIPClient *CCIPClientFilterer) ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, error) { + event := new(CCIPClientChainRemoved) + if err := _CCIPClient.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return nil, err } event.Raw = log @@ -1371,240 +1314,6 @@ func (_CCIPClient *CCIPClientFilterer) ParseMessageAbandoned(log types.Log) (*CC 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 @@ -1921,41 +1630,22 @@ func (it *CCIPClientMessageSentIterator) Close() error { } type CCIPClientMessageSent struct { - IncomingMessageId [32]byte - ACKMessageId [32]byte - Raw types.Log + MessageId [32]byte + Raw types.Log } -func (_CCIPClient *CCIPClientFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPClientMessageSentIterator, error) { +func (_CCIPClient *CCIPClientFilterer) FilterMessageSent(opts *bind.FilterOpts) (*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) + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "MessageSent") 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) - } +func (_CCIPClient *CCIPClientFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSent) (event.Subscription, error) { - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "MessageSent") if err != nil { return nil, err } @@ -2539,22 +2229,18 @@ type SChainConfigs struct { func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { - case _CCIPClient.abi.Events["ApprovedSenderModified"].ID: - return _CCIPClient.ParseApprovedSenderModified(log) + case _CCIPClient.abi.Events["ApprovedSenderAdded"].ID: + return _CCIPClient.ParseApprovedSenderAdded(log) + case _CCIPClient.abi.Events["ApprovedSenderRemoved"].ID: + return _CCIPClient.ParseApprovedSenderRemoved(log) case _CCIPClient.abi.Events["CCIPRouterModified"].ID: return _CCIPClient.ParseCCIPRouterModified(log) case _CCIPClient.abi.Events["ChainAdded"].ID: return _CCIPClient.ParseChainAdded(log) case _CCIPClient.abi.Events["ChainRemoved"].ID: return _CCIPClient.ParseChainRemoved(log) - 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: - return _CCIPClient.ParseMessageAckSent(log) case _CCIPClient.abi.Events["MessageFailed"].ID: return _CCIPClient.ParseMessageFailed(log) case _CCIPClient.abi.Events["MessageRecovered"].ID: @@ -2575,8 +2261,12 @@ func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, err } } -func (CCIPClientApprovedSenderModified) Topic() common.Hash { - return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +func (CCIPClientApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (CCIPClientApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") } func (CCIPClientCCIPRouterModified) Topic() common.Hash { @@ -2591,22 +2281,10 @@ func (CCIPClientChainRemoved) Topic() common.Hash { return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") } -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") -} - -func (CCIPClientMessageAckSent) Topic() common.Hash { - return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") -} - func (CCIPClientMessageFailed) Topic() common.Hash { return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") } @@ -2616,7 +2294,7 @@ func (CCIPClientMessageRecovered) Topic() common.Hash { } func (CCIPClientMessageSent) Topic() common.Hash { - return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") + return common.HexToHash("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") } func (CCIPClientMessageSucceeded) Topic() common.Hash { @@ -2640,8 +2318,6 @@ func (_CCIPClient *CCIPClient) Address() common.Address { } type CCIPClientInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) - GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) @@ -2658,8 +2334,6 @@ type CCIPClientInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) - SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) - AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) @@ -2670,10 +2344,6 @@ type CCIPClientInterface interface { CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) - ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - - ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) - ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) @@ -2682,17 +2352,25 @@ type CCIPClientInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) - FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderModifiedIterator, error) + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*CCIPClientApprovedSenderAdded, error) - WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientApprovedSenderRemovedIterator, error) - ParseApprovedSenderModified(log types.Log) (*CCIPClientApprovedSenderModified, error) + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderRemoved(log types.Log) (*CCIPClientApprovedSenderRemoved, error) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientCCIPRouterModifiedIterator, error) @@ -2712,30 +2390,12 @@ type CCIPClientInterface interface { ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, 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) - 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) - - 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) @@ -2748,9 +2408,9 @@ type CCIPClientInterface interface { ParseMessageRecovered(log types.Log) (*CCIPClientMessageRecovered, error) - FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPClientMessageSentIterator, error) + FilterMessageSent(opts *bind.FilterOpts) (*CCIPClientMessageSentIterator, error) - WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageSent) (event.Subscription, error) ParseMessageSent(log types.Log) (*CCIPClientMessageSent, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index 25a0cfc0fb..069bd4e6da 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -56,8 +56,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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b506040516200304e3803806200304e8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e5080620001fe6000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a55780639fe74e2611610074578063cf6730f811610059578063cf6730f81461034a578063e4ca87541461036a578063f2fde38b1461038a57600080fd5b80639fe74e26146102ff578063b0f479a11461031f57600080fd5b806379ba50971461025e5780638462a2b91461027357806385572ffb146102935780638da5cb5b146102b357600080fd5b8063536c6bfa116100e1578063536c6bfa146101d15780635e35359e146101f15780636939cd97146102115780636d62d6331461023e57600080fd5b80630e958d6b1461011e57806335f170ef146101535780634e12498b146101815780635075a9d4146101a357600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e6101393660046121fc565b6103aa565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e366004612281565b6103f5565b60405161014a92919061230c565b34801561018d57600080fd5b506101a161019c36600461235c565b610521565b005b3480156101af57600080fd5b506101c36101be366004612379565b6105ed565b60405190815260200161014a565b3480156101dd57600080fd5b506101a16101ec366004612392565b610600565b3480156101fd57600080fd5b506101a161020c3660046123be565b610664565b34801561021d57600080fd5b5061023161022c366004612379565b6106f9565b60405161014a91906123ff565b34801561024a57600080fd5b506101a16102593660046124e6565b610904565b34801561026a57600080fd5b506101a1610c1e565b34801561027f57600080fd5b506101a161028e366004612562565b610d1b565b34801561029f57600080fd5b506101a16102ae3660046125ce565b61107c565b3480156102bf57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b34801561030b57600080fd5b506101a161031a366004612609565b611285565b34801561032b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102da565b34801561035657600080fd5b506101a16103653660046125ce565b611616565b34801561037657600080fd5b506101a1610385366004612379565b611752565b34801561039657600080fd5b506101a16103a536600461235c565b6119bc565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103d9908590859061264b565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104109061265b565b80601f016020809104026020016040519081016040528092919081815260200182805461043c9061265b565b80156104895780601f1061045e57610100808354040283529160200191610489565b820191906000526020600020905b81548152906001019060200180831161046c57829003601f168201915b50505050509080600101805461049e9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546104ca9061265b565b80156105175780601f106104ec57610100808354040283529160200191610517565b820191906000526020600020905b8154815290600101906020018083116104fa57829003601f168201915b5050505050905082565b6105296119d0565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b60006105fa600583611a53565b92915050565b6106086119d0565b6106128282611a66565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61066c6119d0565b61068d73ffffffffffffffffffffffffffffffffffffffff84168383611bc0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ec91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107689061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546107949061265b565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b505050505081526020016003820180546107fa9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546108269061265b565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108a1565b505050915250909392505050565b61090c6119d0565b6001610919600584611a53565b14610958576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109688260025b60059190611c4d565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916109b09061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546109dc9061265b565b8015610a295780601f106109fe57610100808354040283529160200191610a29565b820191906000526020600020905b815481529060010190602001808311610a0c57829003601f168201915b50505050508152602001600382018054610a429061265b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e9061265b565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ae9565b5050505081525050905060005b816080015151811015610bcd57610bc58383608001518381518110610b7257610b726126ae565b60200260200101516020015184608001518481518110610b9457610b946126ae565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611bc09092919063ffffffff16565b600101610b4b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d236119d0565b60005b81811015610ec65760036000848484818110610d4457610d446126ae565b9050602002810190610d5691906126dd565b610d64906020810190612281565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d9b57610d9b6126ae565b9050602002810190610dad91906126dd565b610dbb90602081019061271b565b604051610dc992919061264b565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610e1057610e106126ae565b9050602002810190610e2291906126dd565b610e3090602081019061271b565b604051610e3e92919061264b565b6040518091039020838383818110610e5857610e586126ae565b9050602002810190610e6a91906126dd565b610e78906020810190612281565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610eb6911515815260200190565b60405180910390a3600101610d26565b5060005b8381101561107557600160036000878785818110610eea57610eea6126ae565b9050602002810190610efc91906126dd565b610f0a906020810190612281565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f4157610f416126ae565b9050602002810190610f5391906126dd565b610f6190602081019061271b565b604051610f6f92919061264b565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610fbf57610fbf6126ae565b9050602002810190610fd191906126dd565b610fdf90602081019061271b565b604051610fed92919061264b565b6040518091039020858583818110611007576110076126ae565b905060200281019061101991906126dd565b611027906020810190612281565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051611065911515815260200190565b60405180910390a3600101610eca565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146110cf576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094f565b6110df6040820160208301612281565b67ffffffffffffffff81166000908152600360205260409020805481906111059061265b565b905060000361114c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061118890869060040161288d565b600060405180830381600087803b1580156111a257600080fd5b505af19250505080156111b3575060015b611253573d8080156111e1576040519150601f19603f3d011682016040523d82523d6000602084013e6111e6565b606091505b506111f38435600161095f565b508335600090815260046020526040902084906112108282612c8e565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611245908490612d8e565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61128d6119d0565b60005b81811015611280578282828181106112aa576112aa6126ae565b90506020028101906112bc9190612da1565b6112cd906040810190602001612de3565b61139957600360008484848181106112e7576112e76126ae565b90506020028101906112f99190612da1565b611307906020810190612281565b67ffffffffffffffff1681526020810191909152604001600090812061132c91612198565b82828281811061133e5761133e6126ae565b90506020028101906113509190612da1565b61135e906020810190612281565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261160e565b8282828181106113ab576113ab6126ae565b90506020028101906113bd9190612da1565b6113cb90604081019061271b565b9050600003611406576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061141e5761141e6126ae565b90506020028101906114309190612da1565b61143e906020810190612281565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611474576114746126ae565b90506020028101906114869190612da1565b61149490604081019061271b565b82916114a1919083612a1a565b508383838181106114b4576114b46126ae565b90506020028101906114c69190612da1565b6114d490606081019061271b565b15905061151f578383838181106114ed576114ed6126ae565b90506020028101906114ff9190612da1565b61150d90606081019061271b565b600183019161151d919083612a1a565b505b838383818110611531576115316126ae565b90506020028101906115439190612da1565b61155190604081019061271b565b60405161155f92919061264b565b6040518091039020848484818110611579576115796126ae565b905060200281019061158b9190612da1565b611599906020810190612281565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106115d6576115d66126ae565b90506020028101906115e89190612da1565b6115f690606081019061271b565b604051611604929190612e00565b60405180910390a3505b600101611290565b33301461164f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61165f6040820160208301612281565b61166c604083018361271b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116c39250905061265b565b159050806117195750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117049190612e14565b9081526040519081900360200190205460ff16155b1561128057806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094f9190612d8e565b600161175f600583611a53565b14611799576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094f565b6117a481600061095f565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117ec9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546118189061265b565b80156118655780601f1061183a57610100808354040283529160200191611865565b820191906000526020600020905b81548152906001019060200180831161184857829003601f168201915b5050505050815260200160038201805461187e9061265b565b80601f01602080910402602001604051908101604052809291908181526020018280546118aa9061265b565b80156118f75780601f106118cc576101008083540402835291602001916118f7565b820191906000526020600020905b8154815290600101906020018083116118da57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561197a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611925565b5050505081525050905061198d81611c62565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6119c46119d0565b6119cd81611c6a565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094f565b565b6000611a5f8383611d5f565b9392505050565b80471015611ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b2a576040519150601f19603f3d011682016040523d82523d6000602084013e611b2f565b606091505b5050905080611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094f565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611280908490611de9565b6000611c5a848484611ef5565b949350505050565b6119cd6119d0565b3373ffffffffffffffffffffffffffffffffffffffff821603611ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611d835750611d838484611f12565b611a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161094f565b6000611e4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f1e9092919063ffffffff16565b8051909150156112805780806020019051810190611e699190612e26565b611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094f565b60008281526002840160205260408120829055611c5a8484611f2d565b6000611a5f8383611f39565b6060611c5a8484600085611f51565b6000611a5f838361206a565b60008181526001830160205260408120541515611a5f565b606082471015611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094f565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161200c9190612e14565b60006040518083038185875af1925050503d8060008114612049576040519150601f19603f3d011682016040523d82523d6000602084013e61204e565b606091505b509150915061205f878383876120b9565b979650505050505050565b60008181526001830160205260408120546120b1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105fa565b5060006105fa565b6060831561214f5782516000036121485773ffffffffffffffffffffffffffffffffffffffff85163b612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094f565b5081611c5a565b611c5a83838151156121645781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f9190612d8e565b5080546121a49061265b565b6000825580601f106121b4575050565b601f0160209004906000526020600020908101906119cd91905b808211156121e257600081556001016121ce565b5090565b67ffffffffffffffff811681146119cd57600080fd5b60008060006040848603121561221157600080fd5b833561221c816121e6565b9250602084013567ffffffffffffffff8082111561223957600080fd5b818601915086601f83011261224d57600080fd5b81358181111561225c57600080fd5b87602082850101111561226e57600080fd5b6020830194508093505050509250925092565b60006020828403121561229357600080fd5b8135611a5f816121e6565b60005b838110156122b95781810151838201526020016122a1565b50506000910152565b600081518084526122da81602086016020860161229e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061231f60408301856122c2565b828103602084015261233181856122c2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119cd57600080fd5b60006020828403121561236e57600080fd5b8135611a5f8161233a565b60006020828403121561238b57600080fd5b5035919050565b600080604083850312156123a557600080fd5b82356123b08161233a565b946020939093013593505050565b6000806000606084860312156123d357600080fd5b83356123de8161233a565b925060208401356123ee8161233a565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a0606086015261243d60c08601836122c2565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261247984836122c2565b608089015188820390920160a089015281518082529186019450600092508501905b808310156124da578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600192909201919083019061249b565b50979650505050505050565b600080604083850312156124f957600080fd5b82359150602083013561250b8161233a565b809150509250929050565b60008083601f84011261252857600080fd5b50813567ffffffffffffffff81111561254057600080fd5b6020830191508360208260051b850101111561255b57600080fd5b9250929050565b6000806000806040858703121561257857600080fd5b843567ffffffffffffffff8082111561259057600080fd5b61259c88838901612516565b909650945060208701359150808211156125b557600080fd5b506125c287828801612516565b95989497509550505050565b6000602082840312156125e057600080fd5b813567ffffffffffffffff8111156125f757600080fd5b820160a08185031215611a5f57600080fd5b6000806020838503121561261c57600080fd5b823567ffffffffffffffff81111561263357600080fd5b61263f85828601612516565b90969095509350505050565b8183823760009101908152919050565b600181811c9082168061266f57607f821691505b6020821081036126a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261271157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261275057600080fd5b83018035915067ffffffffffffffff82111561276b57600080fd5b60200191503681900382131561255b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127b557600080fd5b830160208101925035905067ffffffffffffffff8111156127d557600080fd5b80360382131561255b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156128825781356128508161233a565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161283d565b509495945050505050565b6020815281356020820152600060208301356128a8816121e6565b67ffffffffffffffff80821660408501526128c66040860186612780565b925060a060608601526128dd60c0860184836127e4565b9250506128ed6060860186612780565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526129238583856127e4565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261295c57600080fd5b6020928801928301923591508382111561297557600080fd5b8160061b360383131561298757600080fd5b8685030160a087015261205f84828461282d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611280576000816000526020600020601f850160051c810160208610156129f35750805b601f850160051c820191505b81811015612a12578281556001016129ff565b505050505050565b67ffffffffffffffff831115612a3257612a3261299b565b612a4683612a40835461265b565b836129ca565b6000601f841160018114612a985760008515612a625750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611075565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612ae75786850135825560209485019460019092019101612ac7565b5086821015612b22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b8135612ba18161233a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115612c0757612c0761299b565b805483825580841015612c5957612c1d81612b34565b612c2685612b34565b6000848152602081209283019291909101905b82821015612c5557808255806001830155600282019150612c39565b5050505b5060008181526020812083915b85811015612a1257612c788383612b96565b6040929092019160029190910190600101612c66565b81358155600181016020830135612ca4816121e6565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612ce4604086018661271b565b93509150612cf6838360028701612a1a565b612d03606086018661271b565b93509150612d15838360038701612a1a565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612d4c57600080fd5b918401918235915080821115612d6157600080fd5b506020820191508060061b3603821315612d7a57600080fd5b612d88818360048601612bee565b50505050565b602081526000611a5f60208301846122c2565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261271157600080fd5b80151581146119cd57600080fd5b600060208284031215612df557600080fd5b8135611a5f81612dd5565b602081526000611c5a6020830184866127e4565b6000825161271181846020870161229e565b600060208284031215612e3857600080fd5b8151611a5f81612dd556fea164736f6c6343000818000a", + 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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162003098380380620030988339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e9a80620001fe6000396000f3fe6080604052600436106101125760003560e01c80638462a2b9116100a5578063b0f479a111610074578063cf6730f811610059578063cf6730f81461034a578063e4ca87541461036a578063f2fde38b1461038a57600080fd5b8063b0f479a1146102ff578063c851cc321461032a57600080fd5b80638462a2b91461025357806385572ffb146102735780638da5cb5b146102935780639fe74e26146102df57600080fd5b80635e35359e116100e15780635e35359e146101d15780636939cd97146101f15780636d62d6331461021e57806379ba50971461023e57600080fd5b80630e958d6b1461011e57806335f170ef146101535780635075a9d414610181578063536c6bfa146101af57600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e610139366004612246565b6103aa565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e3660046122cb565b6103f5565b60405161014a929190612356565b34801561018d57600080fd5b506101a161019c366004612384565b610521565b60405190815260200161014a565b3480156101bb57600080fd5b506101cf6101ca3660046123bf565b610534565b005b3480156101dd57600080fd5b506101cf6101ec3660046123eb565b610598565b3480156101fd57600080fd5b5061021161020c366004612384565b61062d565b60405161014a919061242c565b34801561022a57600080fd5b506101cf610239366004612513565b610838565b34801561024a57600080fd5b506101cf610b52565b34801561025f57600080fd5b506101cf61026e36600461258f565b610c4f565b34801561027f57600080fd5b506101cf61028e3660046125fb565b610f90565b34801561029f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b3480156102eb57600080fd5b506101cf6102fa366004612636565b611199565b34801561030b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102ba565b34801561033657600080fd5b506101cf610345366004612678565b61152a565b34801561035657600080fd5b506101cf6103653660046125fb565b6115f6565b34801561037657600080fd5b506101cf610385366004612384565b611732565b34801561039657600080fd5b506101cf6103a5366004612678565b61199c565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103d99085908590612695565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610410906126a5565b80601f016020809104026020016040519081016040528092919081815260200182805461043c906126a5565b80156104895780601f1061045e57610100808354040283529160200191610489565b820191906000526020600020905b81548152906001019060200180831161046c57829003601f168201915b50505050509080600101805461049e906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546104ca906126a5565b80156105175780601f106104ec57610100808354040283529160200191610517565b820191906000526020600020905b8154815290600101906020018083116104fa57829003601f168201915b5050505050905082565b600061052e6005836119b0565b92915050565b61053c6119c3565b6105468282611a46565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6105a06119c3565b6105c173ffffffffffffffffffffffffffffffffffffffff84168383611ba0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161062091815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161069c906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546106c8906126a5565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b5050505050815260200160038201805461072e906126a5565b80601f016020809104026020016040519081016040528092919081815260200182805461075a906126a5565b80156107a75780601f1061077c576101008083540402835291602001916107a7565b820191906000526020600020905b81548152906001019060200180831161078a57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561082a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107d5565b505050915250909392505050565b6108406119c3565b600161084d6005846119b0565b1461088c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61089c8260025b60059190611c2d565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108e4906126a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610910906126a5565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b50505050508152602001600382018054610976906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546109a2906126a5565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a725760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a1d565b5050505081525050905060005b816080015151811015610b0157610af98383608001518381518110610aa657610aa66126f8565b60200260200101516020015184608001518481518110610ac857610ac86126f8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611ba09092919063ffffffff16565b600101610a7f565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610883565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c576119c3565b60005b81811015610dea5760036000848484818110610c7857610c786126f8565b9050602002810190610c8a9190612727565b610c989060208101906122cb565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610ccf57610ccf6126f8565b9050602002810190610ce19190612727565b610cef906020810190612765565b604051610cfd929190612695565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d4457610d446126f8565b9050602002810190610d569190612727565b610d64906020810190612765565b604051610d72929190612695565b6040518091039020838383818110610d8c57610d8c6126f8565b9050602002810190610d9e9190612727565b610dac9060208101906122cb565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c5a565b5060005b83811015610f8957600160036000878785818110610e0e57610e0e6126f8565b9050602002810190610e209190612727565b610e2e9060208101906122cb565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e6557610e656126f8565b9050602002810190610e779190612727565b610e85906020810190612765565b604051610e93929190612695565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610ee357610ee36126f8565b9050602002810190610ef59190612727565b610f03906020810190612765565b604051610f11929190612695565b6040518091039020858583818110610f2b57610f2b6126f8565b9050602002810190610f3d9190612727565b610f4b9060208101906122cb565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610dee565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610fe3576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610883565b610ff360408201602083016122cb565b67ffffffffffffffff8116600090815260036020526040902080548190611019906126a5565b9050600003611060576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610883565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061109c9086906004016128d7565b600060405180830381600087803b1580156110b657600080fd5b505af19250505080156110c7575060015b611167573d8080156110f5576040519150601f19603f3d011682016040523d82523d6000602084013e6110fa565b606091505b5061110784356001610893565b508335600090815260046020526040902084906111248282612cd8565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611159908490612dd8565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111a16119c3565b60005b81811015611194578282828181106111be576111be6126f8565b90506020028101906111d09190612deb565b6111e1906040810190602001612e2d565b6112ad57600360008484848181106111fb576111fb6126f8565b905060200281019061120d9190612deb565b61121b9060208101906122cb565b67ffffffffffffffff16815260208101919091526040016000908120611240916121e2565b828282818110611252576112526126f8565b90506020028101906112649190612deb565b6112729060208101906122cb565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611522565b8282828181106112bf576112bf6126f8565b90506020028101906112d19190612deb565b6112df906040810190612765565b905060000361131a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611332576113326126f8565b90506020028101906113449190612deb565b6113529060208101906122cb565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611388576113886126f8565b905060200281019061139a9190612deb565b6113a8906040810190612765565b82916113b5919083612a64565b508383838181106113c8576113c86126f8565b90506020028101906113da9190612deb565b6113e8906060810190612765565b15905061143357838383818110611401576114016126f8565b90506020028101906114139190612deb565b611421906060810190612765565b6001830191611431919083612a64565b505b838383818110611445576114456126f8565b90506020028101906114579190612deb565b611465906040810190612765565b604051611473929190612695565b604051809103902084848481811061148d5761148d6126f8565b905060200281019061149f9190612deb565b6114ad9060208101906122cb565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106114ea576114ea6126f8565b90506020028101906114fc9190612deb565b61150a906060810190612765565b604051611518929190612e4a565b60405180910390a3505b6001016111a4565b6115326119c3565b73ffffffffffffffffffffffffffffffffffffffff811661157f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b33301461162f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61163f60408201602083016122cb565b61164c6040830183612765565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116a3925090506126a5565b159050806116f95750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116e49190612e5e565b9081526040519081900360200190205460ff16155b1561119457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108839190612dd8565b600161173f6005836119b0565b14611779576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610883565b611784816000610893565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117cc906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546117f8906126a5565b80156118455780601f1061181a57610100808354040283529160200191611845565b820191906000526020600020905b81548152906001019060200180831161182857829003601f168201915b5050505050815260200160038201805461185e906126a5565b80601f016020809104026020016040519081016040528092919081815260200182805461188a906126a5565b80156118d75780601f106118ac576101008083540402835291602001916118d7565b820191906000526020600020905b8154815290600101906020018083116118ba57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561195a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611905565b5050505081525050905061196d81611c42565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6119a46119c3565b6119ad81611cb4565b50565b60006119bc8383611da9565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610883565b565b80471015611ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610883565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b0a576040519150601f19603f3d011682016040523d82523d6000602084013e611b0f565b606091505b5050905080611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610883565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611194908490611e33565b6000611c3a848484611f3f565b949350505050565b611c4a6119c3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611c8690849060040161242c565b600060405180830381600087803b158015611ca057600080fd5b505af1158015610f89573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610883565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611dcd5750611dcd8484611f5c565b6119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610883565b6000611e95826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f689092919063ffffffff16565b8051909150156111945780806020019051810190611eb39190612e70565b611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610883565b60008281526002840160205260408120829055611c3a8484611f77565b60006119bc8383611f83565b6060611c3a8484600085611f9b565b60006119bc83836120b4565b600081815260018301602052604081205415156119bc565b60608247101561202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610883565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120569190612e5e565b60006040518083038185875af1925050503d8060008114612093576040519150601f19603f3d011682016040523d82523d6000602084013e612098565b606091505b50915091506120a987838387612103565b979650505050505050565b60008181526001830160205260408120546120fb5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561052e565b50600061052e565b606083156121995782516000036121925773ffffffffffffffffffffffffffffffffffffffff85163b612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610883565b5081611c3a565b611c3a83838151156121ae5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108839190612dd8565b5080546121ee906126a5565b6000825580601f106121fe575050565b601f0160209004906000526020600020908101906119ad91905b8082111561222c5760008155600101612218565b5090565b67ffffffffffffffff811681146119ad57600080fd5b60008060006040848603121561225b57600080fd5b833561226681612230565b9250602084013567ffffffffffffffff8082111561228357600080fd5b818601915086601f83011261229757600080fd5b8135818111156122a657600080fd5b8760208285010111156122b857600080fd5b6020830194508093505050509250925092565b6000602082840312156122dd57600080fd5b81356119bc81612230565b60005b838110156123035781810151838201526020016122eb565b50506000910152565b600081518084526123248160208601602086016122e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612369604083018561230c565b828103602084015261237b818561230c565b95945050505050565b60006020828403121561239657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146119ad57600080fd5b600080604083850312156123d257600080fd5b82356123dd8161239d565b946020939093013593505050565b60008060006060848603121561240057600080fd5b833561240b8161239d565b9250602084013561241b8161239d565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a0606086015261246a60c086018361230c565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808785030160808801526124a6848361230c565b608089015188820390920160a089015281518082529186019450600092508501905b80831015612507578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019290920191908301906124c8565b50979650505050505050565b6000806040838503121561252657600080fd5b8235915060208301356125388161239d565b809150509250929050565b60008083601f84011261255557600080fd5b50813567ffffffffffffffff81111561256d57600080fd5b6020830191508360208260051b850101111561258857600080fd5b9250929050565b600080600080604085870312156125a557600080fd5b843567ffffffffffffffff808211156125bd57600080fd5b6125c988838901612543565b909650945060208701359150808211156125e257600080fd5b506125ef87828801612543565b95989497509550505050565b60006020828403121561260d57600080fd5b813567ffffffffffffffff81111561262457600080fd5b820160a081850312156119bc57600080fd5b6000806020838503121561264957600080fd5b823567ffffffffffffffff81111561266057600080fd5b61266c85828601612543565b90969095509350505050565b60006020828403121561268a57600080fd5b81356119bc8161239d565b8183823760009101908152919050565b600181811c908216806126b957607f821691505b6020821081036126f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261275b57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261279a57600080fd5b83018035915067ffffffffffffffff8211156127b557600080fd5b60200191503681900382131561258857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127ff57600080fd5b830160208101925035905067ffffffffffffffff81111561281f57600080fd5b80360382131561258857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156128cc57813561289a8161239d565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612887565b509495945050505050565b6020815281356020820152600060208301356128f281612230565b67ffffffffffffffff808216604085015261291060408601866127ca565b925060a0606086015261292760c08601848361282e565b92505061293760608601866127ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261296d85838561282e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126129a657600080fd5b602092880192830192359150838211156129bf57600080fd5b8160061b36038313156129d157600080fd5b8685030160a08701526120a9848284612877565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611194576000816000526020600020601f850160051c81016020861015612a3d5750805b601f850160051c820191505b81811015612a5c57828155600101612a49565b505050505050565b67ffffffffffffffff831115612a7c57612a7c6129e5565b612a9083612a8a83546126a5565b83612a14565b6000601f841160018114612ae25760008515612aac5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f89565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612b315786850135825560209485019460019092019101612b11565b5086821015612b6c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612bdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b8135612beb8161239d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115612c5157612c516129e5565b805483825580841015612ca357612c6781612b7e565b612c7085612b7e565b6000848152602081209283019291909101905b82821015612c9f57808255806001830155600282019150612c83565b5050505b5060008181526020812083915b85811015612a5c57612cc28383612be0565b6040929092019160029190910190600101612cb0565b81358155600181016020830135612cee81612230565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612d2e6040860186612765565b93509150612d40838360028701612a64565b612d4d6060860186612765565b93509150612d5f838360038701612a64565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612d9657600080fd5b918401918235915080821115612dab57600080fd5b506020820191508060061b3603821315612dc457600080fd5b612dd2818360048601612c38565b50505050565b6020815260006119bc602083018461230c565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261275b57600080fd5b80151581146119ad57600080fd5b600060208284031215612e3f57600080fd5b81356119bc81612e1f565b602081526000611c3a60208301848661282e565b6000825161275b8184602087016122e8565b600060208284031215612e8257600080fd5b81516119bc81612e1f56fea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -384,18 +384,6 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) CcipReceive(message ClientAn return _CCIPReceiver.Contract.CcipReceive(&_CCIPReceiver.TransactOpts, message) } -func (_CCIPReceiver *CCIPReceiverTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { - return _CCIPReceiver.contract.Transact(opts, "modifyRouter", newRouter) -} - -func (_CCIPReceiver *CCIPReceiverSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _CCIPReceiver.Contract.ModifyRouter(&_CCIPReceiver.TransactOpts, newRouter) -} - -func (_CCIPReceiver *CCIPReceiverTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _CCIPReceiver.Contract.ModifyRouter(&_CCIPReceiver.TransactOpts, newRouter) -} - func (_CCIPReceiver *CCIPReceiverTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _CCIPReceiver.contract.Transact(opts, "processMessage", message) } @@ -444,6 +432,18 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateApprovedSenders(adds [ return _CCIPReceiver.Contract.UpdateApprovedSenders(&_CCIPReceiver.TransactOpts, adds, removes) } +func (_CCIPReceiver *CCIPReceiverTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiver.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_CCIPReceiver *CCIPReceiverSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.UpdateRouter(&_CCIPReceiver.TransactOpts, newRouter) +} + +func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiver.Contract.UpdateRouter(&_CCIPReceiver.TransactOpts, newRouter) +} + func (_CCIPReceiver *CCIPReceiverTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _CCIPReceiver.contract.Transact(opts, "withdrawNativeToken", to, amount) } @@ -480,8 +480,8 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) Receive() (*types.Transactio return _CCIPReceiver.Contract.Receive(&_CCIPReceiver.TransactOpts) } -type CCIPReceiverApprovedSenderModifiedIterator struct { - Event *CCIPReceiverApprovedSenderModified +type CCIPReceiverApprovedSenderAddedIterator struct { + Event *CCIPReceiverApprovedSenderAdded contract *bind.BoundContract event string @@ -492,7 +492,7 @@ type CCIPReceiverApprovedSenderModifiedIterator struct { fail error } -func (it *CCIPReceiverApprovedSenderModifiedIterator) Next() bool { +func (it *CCIPReceiverApprovedSenderAddedIterator) Next() bool { if it.fail != nil { return false @@ -501,7 +501,7 @@ func (it *CCIPReceiverApprovedSenderModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverApprovedSenderModified) + it.Event = new(CCIPReceiverApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -516,7 +516,7 @@ func (it *CCIPReceiverApprovedSenderModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverApprovedSenderModified) + it.Event = new(CCIPReceiverApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -531,23 +531,22 @@ func (it *CCIPReceiverApprovedSenderModifiedIterator) Next() bool { } } -func (it *CCIPReceiverApprovedSenderModifiedIterator) Error() error { +func (it *CCIPReceiverApprovedSenderAddedIterator) Error() error { return it.fail } -func (it *CCIPReceiverApprovedSenderModifiedIterator) Close() error { +func (it *CCIPReceiverApprovedSenderAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverApprovedSenderModified struct { +type CCIPReceiverApprovedSenderAdded struct { DestChainSelector uint64 Recipient common.Hash - IsBeingApproved bool Raw types.Log } -func (_CCIPReceiver *CCIPReceiverFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderModifiedIterator, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderAddedIterator, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -558,14 +557,14 @@ func (_CCIPReceiver *CCIPReceiverFilterer) FilterApprovedSenderModified(opts *bi recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPReceiverApprovedSenderModifiedIterator{contract: _CCIPReceiver.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil + return &CCIPReceiverApprovedSenderAddedIterator{contract: _CCIPReceiver.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil } -func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { +func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -576,7 +575,7 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderModified(opts *bin recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -586,8 +585,8 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderModified(opts *bin select { case log := <-logs: - event := new(CCIPReceiverApprovedSenderModified) - if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + event := new(CCIPReceiverApprovedSenderAdded) + if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return err } event.Raw = log @@ -608,9 +607,145 @@ func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderModified(opts *bin }), nil } -func (_CCIPReceiver *CCIPReceiverFilterer) ParseApprovedSenderModified(log types.Log) (*CCIPReceiverApprovedSenderModified, error) { - event := new(CCIPReceiverApprovedSenderModified) - if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { +func (_CCIPReceiver *CCIPReceiverFilterer) ParseApprovedSenderAdded(log types.Log) (*CCIPReceiverApprovedSenderAdded, error) { + event := new(CCIPReceiverApprovedSenderAdded) + if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReceiverApprovedSenderRemovedIterator struct { + Event *CCIPReceiverApprovedSenderRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverApprovedSenderRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverApprovedSenderRemoved) + 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(CCIPReceiverApprovedSenderRemoved) + 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 *CCIPReceiverApprovedSenderRemovedIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverApprovedSenderRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverApprovedSenderRemoved struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log +} + +func (_CCIPReceiver *CCIPReceiverFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderRemovedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPReceiver.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &CCIPReceiverApprovedSenderRemovedIterator{contract: _CCIPReceiver.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiver *CCIPReceiverFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPReceiver.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReceiverApprovedSenderRemoved) + if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderRemoved", 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) ParseApprovedSenderRemoved(log types.Log) (*CCIPReceiverApprovedSenderRemoved, error) { + event := new(CCIPReceiverApprovedSenderRemoved) + if err := _CCIPReceiver.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log @@ -1943,8 +2078,10 @@ type SChainConfigs struct { func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { - case _CCIPReceiver.abi.Events["ApprovedSenderModified"].ID: - return _CCIPReceiver.ParseApprovedSenderModified(log) + case _CCIPReceiver.abi.Events["ApprovedSenderAdded"].ID: + return _CCIPReceiver.ParseApprovedSenderAdded(log) + case _CCIPReceiver.abi.Events["ApprovedSenderRemoved"].ID: + return _CCIPReceiver.ParseApprovedSenderRemoved(log) case _CCIPReceiver.abi.Events["CCIPRouterModified"].ID: return _CCIPReceiver.ParseCCIPRouterModified(log) case _CCIPReceiver.abi.Events["ChainAdded"].ID: @@ -1971,8 +2108,12 @@ func (_CCIPReceiver *CCIPReceiver) ParseLog(log types.Log) (generated.AbigenLog, } } -func (CCIPReceiverApprovedSenderModified) Topic() common.Hash { - return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +func (CCIPReceiverApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (CCIPReceiverApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") } func (CCIPReceiverCCIPRouterModified) Topic() common.Hash { @@ -2042,8 +2183,6 @@ type CCIPReceiverInterface interface { CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) - ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) - ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) @@ -2052,17 +2191,25 @@ type CCIPReceiverInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) - FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderModifiedIterator, error) + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*CCIPReceiverApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverApprovedSenderRemovedIterator, error) - WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) - ParseApprovedSenderModified(log types.Log) (*CCIPReceiverApprovedSenderModified, error) + ParseApprovedSenderRemoved(log types.Log) (*CCIPReceiverApprovedSenderRemoved, error) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPReceiverCCIPRouterModifiedIterator, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 1795a9bbbe..2c04c26098 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -48,8 +48,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\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162002730380380620027308339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61253280620001fe6000396000f3fe6080604052600436106100cb5760003560e01c80638462a2b911610074578063b0f479a11161004e578063b0f479a11461023d578063effde24014610268578063f2fde38b1461028957600080fd5b80638462a2b9146101b15780638da5cb5b146101d15780639fe74e261461021d57600080fd5b8063536c6bfa116100a5578063536c6bfa1461015c5780635e35359e1461017c57806379ba50971461019c57600080fd5b80630e958d6b146100d757806335f170ef1461010c5780634e12498b1461013a57600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b506100f76100f2366004611c27565b6102a9565b60405190151581526020015b60405180910390f35b34801561011857600080fd5b5061012c610127366004611c7a565b6102f4565b604051610103929190611d0a565b34801561014657600080fd5b5061015a610155366004611d65565b610420565b005b34801561016857600080fd5b5061015a610177366004611d82565b6104ec565b34801561018857600080fd5b5061015a610197366004611dae565b610550565b3480156101a857600080fd5b5061015a6105e5565b3480156101bd57600080fd5b5061015a6101cc366004611e34565b6106e7565b3480156101dd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610103565b34801561022957600080fd5b5061015a610238366004611ea0565b610a48565b34801561024957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101f8565b61027b610276366004611ee2565b610dde565b604051908152602001610103565b34801561029557600080fd5b5061015a6102a4366004611d65565b61133c565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102d89085908590611fa3565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061030f90611fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461033b90611fb3565b80156103885780601f1061035d57610100808354040283529160200191610388565b820191906000526020600020905b81548152906001019060200180831161036b57829003601f168201915b50505050509080600101805461039d90611fb3565b80601f01602080910402602001604051908101604052809291908181526020018280546103c990611fb3565b80156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905082565b610428611350565b73ffffffffffffffffffffffffffffffffffffffff8116610475576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6104f4611350565b6104fe82826113d3565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610558611350565b61057973ffffffffffffffffffffffffffffffffffffffff8416838361152d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105d891815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461066b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6106ef611350565b60005b81811015610892576003600084848481811061071057610710612006565b90506020028101906107229190612035565b610730906020810190611c7a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061076757610767612006565b90506020028101906107799190612035565b610787906020810190612073565b604051610795929190611fa3565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106107dc576107dc612006565b90506020028101906107ee9190612035565b6107fc906020810190612073565b60405161080a929190611fa3565b604051809103902083838381811061082457610824612006565b90506020028101906108369190612035565b610844906020810190611c7a565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051610882911515815260200190565b60405180910390a36001016106f2565b5060005b83811015610a41576001600360008787858181106108b6576108b6612006565b90506020028101906108c89190612035565b6108d6906020810190611c7a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061090d5761090d612006565b905060200281019061091f9190612035565b61092d906020810190612073565b60405161093b929190611fa3565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061098b5761098b612006565b905060200281019061099d9190612035565b6109ab906020810190612073565b6040516109b9929190611fa3565b60405180910390208585838181106109d3576109d3612006565b90506020028101906109e59190612035565b6109f3906020810190611c7a565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816001604051610a31911515815260200190565b60405180910390a3600101610896565b5050505050565b610a50611350565b60005b81811015610dd957828282818110610a6d57610a6d612006565b9050602002810190610a7f91906120d8565b610a9090604081019060200161211a565b610b5c5760036000848484818110610aaa57610aaa612006565b9050602002810190610abc91906120d8565b610aca906020810190611c7a565b67ffffffffffffffff16815260208101919091526040016000908120610aef91611b73565b828282818110610b0157610b01612006565b9050602002810190610b1391906120d8565b610b21906020810190611c7a565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2610dd1565b828282818110610b6e57610b6e612006565b9050602002810190610b8091906120d8565b610b8e906040810190612073565b9050600003610bc9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110610be157610be1612006565b9050602002810190610bf391906120d8565b610c01906020810190611c7a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110610c3757610c37612006565b9050602002810190610c4991906120d8565b610c57906040810190612073565b8291610c649190836121b6565b50838383818110610c7757610c77612006565b9050602002810190610c8991906120d8565b610c97906060810190612073565b159050610ce257838383818110610cb057610cb0612006565b9050602002810190610cc291906120d8565b610cd0906060810190612073565b6001830191610ce09190836121b6565b505b838383818110610cf457610cf4612006565b9050602002810190610d0691906120d8565b610d14906040810190612073565b604051610d22929190611fa3565b6040518091039020848484818110610d3c57610d3c612006565b9050602002810190610d4e91906120d8565b610d5c906020810190611c7a565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110610d9957610d99612006565b9050602002810190610dab91906120d8565b610db9906060810190612073565b604051610dc79291906122d0565b60405180910390a3505b600101610a53565b505050565b67ffffffffffffffff8616600090815260036020526040812080548891908190610e0790611fb3565b9050600003610e4e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610662565b6040805160a08101825267ffffffffffffffff8b16600090815260036020529182208054829190610e7e90611fb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa90611fb3565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610f8757610f786040830286013681900381019061231d565b81526020019060010190610f5b565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610fe290611fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461100e90611fb3565b801561105b5780601f106110305761010080835404028352916020019161105b565b820191906000526020600020905b81548152906001019060200180831161103e57829003601f168201915b5050505050815250905060005b8881101561115d576110d733308c8c8581811061108757611087612006565b905060400201602001358d8d868181106110a3576110a3612006565b6110b99260206040909202019081019150611d65565b73ffffffffffffffffffffffffffffffffffffffff16929190611601565b6002546111559073ffffffffffffffffffffffffffffffffffffffff168b8b8481811061110657611106612006565b905060400201602001358c8c8581811061112257611122612006565b6111389260206040909202019081019150611d65565b73ffffffffffffffffffffffffffffffffffffffff169190611665565b600101611068565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906111b7908e908690600401612375565b602060405180830381865afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f8919061248a565b905073ffffffffffffffffffffffffffffffffffffffff86161561125f5761123873ffffffffffffffffffffffffffffffffffffffff8716333084611601565b60025461125f9073ffffffffffffffffffffffffffffffffffffffff888116911683611665565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f99088161561128f576000611291565b825b8d856040518463ffffffff1660e01b81526004016112b0929190612375565b60206040518083038185885af11580156112ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112f3919061248a565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161132691815260200190565b60405180910390a1505050509695505050505050565b611344611350565b61134d81611763565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610662565b565b8047101561143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610662565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611497576040519150601f19603f3d011682016040523d82523d6000602084013e61149c565b606091505b5050905080610dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610662565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610dd99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611858565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261165f9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161157f565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611700919061248a565b61170a91906124a3565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061165f9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161157f565b3373ffffffffffffffffffffffffffffffffffffffff8216036117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610662565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006118ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119649092919063ffffffff16565b805190915015610dd957808060200190518101906118d891906124e3565b610dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610662565b6060611973848460008561197b565b949350505050565b606082471015611a0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610662565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a369190612500565b60006040518083038185875af1925050503d8060008114611a73576040519150601f19603f3d011682016040523d82523d6000602084013e611a78565b606091505b5091509150611a8987838387611a94565b979650505050505050565b60608315611b2a578251600003611b235773ffffffffffffffffffffffffffffffffffffffff85163b611b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610662565b5081611973565b6119738383815115611b3f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106629190612512565b508054611b7f90611fb3565b6000825580601f10611b8f575050565b601f01602090049060005260206000209081019061134d91905b80821115611bbd5760008155600101611ba9565b5090565b803567ffffffffffffffff81168114611bd957600080fd5b919050565b60008083601f840112611bf057600080fd5b50813567ffffffffffffffff811115611c0857600080fd5b602083019150836020828501011115611c2057600080fd5b9250929050565b600080600060408486031215611c3c57600080fd5b611c4584611bc1565b9250602084013567ffffffffffffffff811115611c6157600080fd5b611c6d86828701611bde565b9497909650939450505050565b600060208284031215611c8c57600080fd5b611c9582611bc1565b9392505050565b60005b83811015611cb7578181015183820152602001611c9f565b50506000910152565b60008151808452611cd8816020860160208601611c9c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611d1d6040830185611cc0565b8281036020840152611d2f8185611cc0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461134d57600080fd5b8035611bd981611d38565b600060208284031215611d7757600080fd5b8135611c9581611d38565b60008060408385031215611d9557600080fd5b8235611da081611d38565b946020939093013593505050565b600080600060608486031215611dc357600080fd5b8335611dce81611d38565b92506020840135611dde81611d38565b929592945050506040919091013590565b60008083601f840112611e0157600080fd5b50813567ffffffffffffffff811115611e1957600080fd5b6020830191508360208260051b8501011115611c2057600080fd5b60008060008060408587031215611e4a57600080fd5b843567ffffffffffffffff80821115611e6257600080fd5b611e6e88838901611def565b90965094506020870135915080821115611e8757600080fd5b50611e9487828801611def565b95989497509550505050565b60008060208385031215611eb357600080fd5b823567ffffffffffffffff811115611eca57600080fd5b611ed685828601611def565b90969095509350505050565b60008060008060008060808789031215611efb57600080fd5b611f0487611bc1565b9550602087013567ffffffffffffffff80821115611f2157600080fd5b818901915089601f830112611f3557600080fd5b813581811115611f4457600080fd5b8a60208260061b8501011115611f5957600080fd5b602083019750809650506040890135915080821115611f7757600080fd5b50611f8489828a01611bde565b9094509250611f97905060608801611d5a565b90509295509295509295565b8183823760009101908152919050565b600181811c90821680611fc757607f821691505b602082108103612000577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261206957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126120a857600080fd5b83018035915067ffffffffffffffff8211156120c357600080fd5b602001915036819003821315611c2057600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261206957600080fd5b801515811461134d57600080fd5b60006020828403121561212c57600080fd5b8135611c958161210c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610dd9576000816000526020600020601f850160051c8101602086101561218f5750805b601f850160051c820191505b818110156121ae5782815560010161219b565b505050505050565b67ffffffffffffffff8311156121ce576121ce612137565b6121e2836121dc8354611fb3565b83612166565b6000601f84116001811461223457600085156121fe5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610a41565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156122835786850135825560209485019460019092019101612263565b50868210156122be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006040828403121561232f57600080fd5b6040516040810181811067ffffffffffffffff8211171561235257612352612137565b604052823561236081611d38565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526123a460e0860182611cc0565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526123df8383611cc0565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612440578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612401565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061247c8187611cc0565b9a9950505050505050505050565b60006020828403121561249c57600080fd5b5051919050565b808201808211156124dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156124f557600080fd5b8151611c958161210c565b60008251612069818460208701611c9c565b602081526000611c956020830184611cc056fea164736f6c6343000818000a", + 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\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162002710380380620027108339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61251280620001fe6000396000f3fe6080604052600436106100cb5760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc3214610248578063effde24014610268578063f2fde38b1461028957600080fd5b80638da5cb5b146101b15780639fe74e26146101fd578063b0f479a11461021d57600080fd5b80635e35359e116100a55780635e35359e1461015c57806379ba50971461017c5780638462a2b91461019157600080fd5b80630e958d6b146100d757806335f170ef1461010c578063536c6bfa1461013a57600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b506100f76100f2366004611c07565b6102a9565b60405190151581526020015b60405180910390f35b34801561011857600080fd5b5061012c610127366004611c5a565b6102f4565b604051610103929190611cea565b34801561014657600080fd5b5061015a610155366004611d3a565b610420565b005b34801561016857600080fd5b5061015a610177366004611d71565b610484565b34801561018857600080fd5b5061015a610519565b34801561019d57600080fd5b5061015a6101ac366004611df7565b61061b565b3480156101bd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610103565b34801561020957600080fd5b5061015a610218366004611e63565b61095c565b34801561022957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101d8565b34801561025457600080fd5b5061015a610263366004611ea5565b610cf2565b61027b610276366004611ec2565b610dbe565b604051908152602001610103565b34801561029557600080fd5b5061015a6102a4366004611ea5565b61131c565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102d89085908590611f83565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061030f90611f93565b80601f016020809104026020016040519081016040528092919081815260200182805461033b90611f93565b80156103885780601f1061035d57610100808354040283529160200191610388565b820191906000526020600020905b81548152906001019060200180831161036b57829003601f168201915b50505050509080600101805461039d90611f93565b80601f01602080910402602001604051908101604052809291908181526020018280546103c990611f93565b80156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905082565b610428611330565b61043282826113b3565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61048c611330565b6104ad73ffffffffffffffffffffffffffffffffffffffff8416838361150d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161050c91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461059f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610623611330565b60005b818110156107b6576003600084848481811061064457610644611fe6565b90506020028101906106569190612015565b610664906020810190611c5a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061069b5761069b611fe6565b90506020028101906106ad9190612015565b6106bb906020810190612053565b6040516106c9929190611f83565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061071057610710611fe6565b90506020028101906107229190612015565b610730906020810190612053565b60405161073e929190611f83565b604051809103902083838381811061075857610758611fe6565b905060200281019061076a9190612015565b610778906020810190611c5a565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610626565b5060005b83811015610955576001600360008787858181106107da576107da611fe6565b90506020028101906107ec9190612015565b6107fa906020810190611c5a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061083157610831611fe6565b90506020028101906108439190612015565b610851906020810190612053565b60405161085f929190611f83565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106108af576108af611fe6565b90506020028101906108c19190612015565b6108cf906020810190612053565b6040516108dd929190611f83565b60405180910390208585838181106108f7576108f7611fe6565b90506020028101906109099190612015565b610917906020810190611c5a565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016107ba565b5050505050565b610964611330565b60005b81811015610ced5782828281811061098157610981611fe6565b905060200281019061099391906120b8565b6109a49060408101906020016120fa565b610a7057600360008484848181106109be576109be611fe6565b90506020028101906109d091906120b8565b6109de906020810190611c5a565b67ffffffffffffffff16815260208101919091526040016000908120610a0391611b53565b828282818110610a1557610a15611fe6565b9050602002810190610a2791906120b8565b610a35906020810190611c5a565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2610ce5565b828282818110610a8257610a82611fe6565b9050602002810190610a9491906120b8565b610aa2906040810190612053565b9050600003610add576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110610af557610af5611fe6565b9050602002810190610b0791906120b8565b610b15906020810190611c5a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110610b4b57610b4b611fe6565b9050602002810190610b5d91906120b8565b610b6b906040810190612053565b8291610b78919083612196565b50838383818110610b8b57610b8b611fe6565b9050602002810190610b9d91906120b8565b610bab906060810190612053565b159050610bf657838383818110610bc457610bc4611fe6565b9050602002810190610bd691906120b8565b610be4906060810190612053565b6001830191610bf4919083612196565b505b838383818110610c0857610c08611fe6565b9050602002810190610c1a91906120b8565b610c28906040810190612053565b604051610c36929190611f83565b6040518091039020848484818110610c5057610c50611fe6565b9050602002810190610c6291906120b8565b610c70906020810190611c5a565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110610cad57610cad611fe6565b9050602002810190610cbf91906120b8565b610ccd906060810190612053565b604051610cdb9291906122b0565b60405180910390a3505b600101610967565b505050565b610cfa611330565b73ffffffffffffffffffffffffffffffffffffffff8116610d47576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff8616600090815260036020526040812080548891908190610de790611f93565b9050600003610e2e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610596565b6040805160a08101825267ffffffffffffffff8b16600090815260036020529182208054829190610e5e90611f93565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a90611f93565b8015610ed75780601f10610eac57610100808354040283529160200191610ed7565b820191906000526020600020905b815481529060010190602001808311610eba57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610f6757610f58604083028601368190038101906122fd565b81526020019060010190610f3b565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610fc290611f93565b80601f0160208091040260200160405190810160405280929190818152602001828054610fee90611f93565b801561103b5780601f106110105761010080835404028352916020019161103b565b820191906000526020600020905b81548152906001019060200180831161101e57829003601f168201915b5050505050815250905060005b8881101561113d576110b733308c8c8581811061106757611067611fe6565b905060400201602001358d8d8681811061108357611083611fe6565b6110999260206040909202019081019150611ea5565b73ffffffffffffffffffffffffffffffffffffffff169291906115e1565b6002546111359073ffffffffffffffffffffffffffffffffffffffff168b8b848181106110e6576110e6611fe6565b905060400201602001358c8c8581811061110257611102611fe6565b6111189260206040909202019081019150611ea5565b73ffffffffffffffffffffffffffffffffffffffff169190611645565b600101611048565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611197908e908690600401612355565b602060405180830381865afa1580156111b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d8919061246a565b905073ffffffffffffffffffffffffffffffffffffffff86161561123f5761121873ffffffffffffffffffffffffffffffffffffffff87163330846115e1565b60025461123f9073ffffffffffffffffffffffffffffffffffffffff888116911683611645565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f99088161561126f576000611271565b825b8d856040518463ffffffff1660e01b8152600401611290929190612355565b60206040518083038185885af11580156112ae573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112d3919061246a565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161130691815260200190565b60405180910390a1505050509695505050505050565b611324611330565b61132d81611743565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610596565b565b8047101561141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610596565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611477576040519150601f19603f3d011682016040523d82523d6000602084013e61147c565b606091505b5050905080610ced576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610596565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ced9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611838565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261163f9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161155f565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156116bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e0919061246a565b6116ea9190612483565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061163f9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161155f565b3373ffffffffffffffffffffffffffffffffffffffff8216036117c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610596565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061189a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119449092919063ffffffff16565b805190915015610ced57808060200190518101906118b891906124c3565b610ced576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610596565b6060611953848460008561195b565b949350505050565b6060824710156119ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610596565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a1691906124e0565b60006040518083038185875af1925050503d8060008114611a53576040519150601f19603f3d011682016040523d82523d6000602084013e611a58565b606091505b5091509150611a6987838387611a74565b979650505050505050565b60608315611b0a578251600003611b035773ffffffffffffffffffffffffffffffffffffffff85163b611b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610596565b5081611953565b6119538383815115611b1f5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059691906124f2565b508054611b5f90611f93565b6000825580601f10611b6f575050565b601f01602090049060005260206000209081019061132d91905b80821115611b9d5760008155600101611b89565b5090565b803567ffffffffffffffff81168114611bb957600080fd5b919050565b60008083601f840112611bd057600080fd5b50813567ffffffffffffffff811115611be857600080fd5b602083019150836020828501011115611c0057600080fd5b9250929050565b600080600060408486031215611c1c57600080fd5b611c2584611ba1565b9250602084013567ffffffffffffffff811115611c4157600080fd5b611c4d86828701611bbe565b9497909650939450505050565b600060208284031215611c6c57600080fd5b611c7582611ba1565b9392505050565b60005b83811015611c97578181015183820152602001611c7f565b50506000910152565b60008151808452611cb8816020860160208601611c7c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611cfd6040830185611ca0565b8281036020840152611d0f8185611ca0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461132d57600080fd5b60008060408385031215611d4d57600080fd5b8235611d5881611d18565b946020939093013593505050565b8035611bb981611d18565b600080600060608486031215611d8657600080fd5b8335611d9181611d18565b92506020840135611da181611d18565b929592945050506040919091013590565b60008083601f840112611dc457600080fd5b50813567ffffffffffffffff811115611ddc57600080fd5b6020830191508360208260051b8501011115611c0057600080fd5b60008060008060408587031215611e0d57600080fd5b843567ffffffffffffffff80821115611e2557600080fd5b611e3188838901611db2565b90965094506020870135915080821115611e4a57600080fd5b50611e5787828801611db2565b95989497509550505050565b60008060208385031215611e7657600080fd5b823567ffffffffffffffff811115611e8d57600080fd5b611e9985828601611db2565b90969095509350505050565b600060208284031215611eb757600080fd5b8135611c7581611d18565b60008060008060008060808789031215611edb57600080fd5b611ee487611ba1565b9550602087013567ffffffffffffffff80821115611f0157600080fd5b818901915089601f830112611f1557600080fd5b813581811115611f2457600080fd5b8a60208260061b8501011115611f3957600080fd5b602083019750809650506040890135915080821115611f5757600080fd5b50611f6489828a01611bbe565b9094509250611f77905060608801611d66565b90509295509295509295565b8183823760009101908152919050565b600181811c90821680611fa757607f821691505b602082108103611fe0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261204957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261208857600080fd5b83018035915067ffffffffffffffff8211156120a357600080fd5b602001915036819003821315611c0057600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261204957600080fd5b801515811461132d57600080fd5b60006020828403121561210c57600080fd5b8135611c75816120ec565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610ced576000816000526020600020601f850160051c8101602086101561216f5750805b601f850160051c820191505b8181101561218e5782815560010161217b565b505050505050565b67ffffffffffffffff8311156121ae576121ae612117565b6121c2836121bc8354611f93565b83612146565b6000601f84116001811461221457600085156121de5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610955565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156122635786850135825560209485019460019092019101612243565b508682101561229e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006040828403121561230f57600080fd5b6040516040810181811067ffffffffffffffff8211171561233257612332612117565b604052823561234081611d18565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a0604086015261238460e0860182611ca0565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526123bf8383611ca0565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612420578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019390930192908601906123e1565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061245c8187611ca0565b9a9950505050505050505050565b60006020828403121561247c57600080fd5b5051919050565b808201808211156124bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156124d557600080fd5b8151611c75816120ec565b60008251612049818460208701611c7c565b602081526000611c756020830184611ca056fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -320,18 +320,6 @@ func (_CCIPSender *CCIPSenderTransactorSession) CcipSend(destChainSelector uint6 return _CCIPSender.Contract.CcipSend(&_CCIPSender.TransactOpts, destChainSelector, tokenAmounts, data, feeToken) } -func (_CCIPSender *CCIPSenderTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { - return _CCIPSender.contract.Transact(opts, "modifyRouter", newRouter) -} - -func (_CCIPSender *CCIPSenderSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _CCIPSender.Contract.ModifyRouter(&_CCIPSender.TransactOpts, newRouter) -} - -func (_CCIPSender *CCIPSenderTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _CCIPSender.Contract.ModifyRouter(&_CCIPSender.TransactOpts, newRouter) -} - func (_CCIPSender *CCIPSenderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { return _CCIPSender.contract.Transact(opts, "transferOwnership", to) } @@ -356,6 +344,18 @@ func (_CCIPSender *CCIPSenderTransactorSession) UpdateApprovedSenders(adds []CCI return _CCIPSender.Contract.UpdateApprovedSenders(&_CCIPSender.TransactOpts, adds, removes) } +func (_CCIPSender *CCIPSenderTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPSender.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_CCIPSender *CCIPSenderSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.UpdateRouter(&_CCIPSender.TransactOpts, newRouter) +} + +func (_CCIPSender *CCIPSenderTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPSender.Contract.UpdateRouter(&_CCIPSender.TransactOpts, newRouter) +} + func (_CCIPSender *CCIPSenderTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _CCIPSender.contract.Transact(opts, "withdrawNativeToken", to, amount) } @@ -392,8 +392,8 @@ func (_CCIPSender *CCIPSenderTransactorSession) Receive() (*types.Transaction, e return _CCIPSender.Contract.Receive(&_CCIPSender.TransactOpts) } -type CCIPSenderApprovedSenderModifiedIterator struct { - Event *CCIPSenderApprovedSenderModified +type CCIPSenderApprovedSenderAddedIterator struct { + Event *CCIPSenderApprovedSenderAdded contract *bind.BoundContract event string @@ -404,7 +404,7 @@ type CCIPSenderApprovedSenderModifiedIterator struct { fail error } -func (it *CCIPSenderApprovedSenderModifiedIterator) Next() bool { +func (it *CCIPSenderApprovedSenderAddedIterator) Next() bool { if it.fail != nil { return false @@ -413,7 +413,7 @@ func (it *CCIPSenderApprovedSenderModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPSenderApprovedSenderModified) + it.Event = new(CCIPSenderApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -428,7 +428,7 @@ func (it *CCIPSenderApprovedSenderModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPSenderApprovedSenderModified) + it.Event = new(CCIPSenderApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -443,23 +443,22 @@ func (it *CCIPSenderApprovedSenderModifiedIterator) Next() bool { } } -func (it *CCIPSenderApprovedSenderModifiedIterator) Error() error { +func (it *CCIPSenderApprovedSenderAddedIterator) Error() error { return it.fail } -func (it *CCIPSenderApprovedSenderModifiedIterator) Close() error { +func (it *CCIPSenderApprovedSenderAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPSenderApprovedSenderModified struct { +type CCIPSenderApprovedSenderAdded struct { DestChainSelector uint64 Recipient common.Hash - IsBeingApproved bool Raw types.Log } -func (_CCIPSender *CCIPSenderFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderModifiedIterator, error) { +func (_CCIPSender *CCIPSenderFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderAddedIterator, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -470,14 +469,14 @@ func (_CCIPSender *CCIPSenderFilterer) FilterApprovedSenderModified(opts *bind.F recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPSenderApprovedSenderModifiedIterator{contract: _CCIPSender.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil + return &CCIPSenderApprovedSenderAddedIterator{contract: _CCIPSender.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil } -func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { +func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -488,7 +487,7 @@ func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderModified(opts *bind.Wa recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -498,8 +497,8 @@ func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderModified(opts *bind.Wa select { case log := <-logs: - event := new(CCIPSenderApprovedSenderModified) - if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + event := new(CCIPSenderApprovedSenderAdded) + if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return err } event.Raw = log @@ -520,9 +519,145 @@ func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderModified(opts *bind.Wa }), nil } -func (_CCIPSender *CCIPSenderFilterer) ParseApprovedSenderModified(log types.Log) (*CCIPSenderApprovedSenderModified, error) { - event := new(CCIPSenderApprovedSenderModified) - if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { +func (_CCIPSender *CCIPSenderFilterer) ParseApprovedSenderAdded(log types.Log) (*CCIPSenderApprovedSenderAdded, error) { + event := new(CCIPSenderApprovedSenderAdded) + if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPSenderApprovedSenderRemovedIterator struct { + Event *CCIPSenderApprovedSenderRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPSenderApprovedSenderRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPSenderApprovedSenderRemoved) + 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(CCIPSenderApprovedSenderRemoved) + 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 *CCIPSenderApprovedSenderRemovedIterator) Error() error { + return it.fail +} + +func (it *CCIPSenderApprovedSenderRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPSenderApprovedSenderRemoved struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log +} + +func (_CCIPSender *CCIPSenderFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderRemovedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPSender.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &CCIPSenderApprovedSenderRemovedIterator{contract: _CCIPSender.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil +} + +func (_CCIPSender *CCIPSenderFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPSender.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPSenderApprovedSenderRemoved) + if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderRemoved", 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) ParseApprovedSenderRemoved(log types.Log) (*CCIPSenderApprovedSenderRemoved, error) { + event := new(CCIPSenderApprovedSenderRemoved) + if err := _CCIPSender.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log @@ -1579,8 +1714,10 @@ type SChainConfigs struct { func (_CCIPSender *CCIPSender) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { - case _CCIPSender.abi.Events["ApprovedSenderModified"].ID: - return _CCIPSender.ParseApprovedSenderModified(log) + case _CCIPSender.abi.Events["ApprovedSenderAdded"].ID: + return _CCIPSender.ParseApprovedSenderAdded(log) + case _CCIPSender.abi.Events["ApprovedSenderRemoved"].ID: + return _CCIPSender.ParseApprovedSenderRemoved(log) case _CCIPSender.abi.Events["CCIPRouterModified"].ID: return _CCIPSender.ParseCCIPRouterModified(log) case _CCIPSender.abi.Events["ChainAdded"].ID: @@ -1603,8 +1740,12 @@ func (_CCIPSender *CCIPSender) ParseLog(log types.Log) (generated.AbigenLog, err } } -func (CCIPSenderApprovedSenderModified) Topic() common.Hash { - return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +func (CCIPSenderApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (CCIPSenderApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") } func (CCIPSenderCCIPRouterModified) Topic() common.Hash { @@ -1660,23 +1801,29 @@ type CCIPSenderInterface interface { CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte, feeToken common.Address) (*types.Transaction, error) - ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) - TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) - FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderModifiedIterator, error) + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*CCIPSenderApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPSenderApprovedSenderRemovedIterator, error) - WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPSenderApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) - ParseApprovedSenderModified(log types.Log) (*CCIPSenderApprovedSenderModified, error) + ParseApprovedSenderRemoved(log types.Log) (*CCIPSenderApprovedSenderRemoved, error) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPSenderCCIPRouterModifiedIterator, 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 b41bd441ad..180ab5dec7 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b5060405162004c8238038062004c82833981016040819052620000349162000571565b81818181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200014d565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b03821683600019620001f8565b505050505050505062000696565b336001600160a01b03821603620001a75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002709190620005b0565b6200027c9190620005ca565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d891869190620002de16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032d906001600160a01b038516908490620003b4565b805190915015620003af57808060200190518101906200034e9190620005f2565b620003af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003c58484600085620003cd565b949350505050565b606082471015620004305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b031685876040516200044e919062000643565b60006040518083038185875af1925050503d80600081146200048d576040519150601f19603f3d011682016040523d82523d6000602084013e62000492565b606091505b509092509050620004a687838387620004b1565b979650505050505050565b60608315620005255782516000036200051d576001600160a01b0385163b6200051d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003c5565b620003c583838151156200053c5781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000661565b6001600160a01b03811681146200056e57600080fd5b50565b600080604083850312156200058557600080fd5b8251620005928162000558565b6020840151909250620005a58162000558565b809150509250929050565b600060208284031215620005c357600080fd5b5051919050565b80820180821115620005ec57634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060557600080fd5b815180151581146200061657600080fd5b9392505050565b60005b838110156200063a57818101518382015260200162000620565b50506000910152565b60008251620006578184602087016200061d565b9190910192915050565b6020815260008251806020840152620006828160408501602087016200061d565b601f01601f19169190910160400192915050565b6145dc80620006a66000396000f3fe6080604052600436106101dc5760003560e01c80636fef519e11610102578063b187bd2611610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063b187bd26146105b9578063b5a11011146105f1578063bee518a414610611578063cf6730f81461063a57600080fd5b80638da5cb5b116100d15780638da5cb5b146105235780639d2aede51461054e5780639fe74e261461056e578063b0f479a11461058e57600080fd5b80636fef519e1461048557806379ba5097146104ce5780638462a2b9146104e357806385572ffb1461050357600080fd5b80632b6e5d631161017a578063536c6bfa11610149578063536c6bfa146103f85780635e35359e146104185780636939cd97146104385780636d62d6331461046557600080fd5b80632b6e5d631461032457806335f170ef1461037c5780634e12498b146103aa5780635075a9d4146103ca57600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102186102033660046134e4565b60096020526000908152604090205460ff1681565b60405161022591906134fd565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613554565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e6102793660046135fb565b610725565b005b34801561028c57600080fd5b5061027e61029b366004613626565b610899565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906136b1565b3480156102fb57600080fd5b5061027e61030a3660046136c4565b6108f3565b34801561031b57600080fd5b5061027e610936565b34801561033057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c6103973660046136c4565b610972565b6040516102259291906136e1565b3480156103b657600080fd5b5061027e6103c53660046135fb565b610a9e565b3480156103d657600080fd5b506103ea6103e53660046134e4565b610b6a565b604051908152602001610225565b34801561040457600080fd5b5061027e61041336600461370f565b610b7d565b34801561042457600080fd5b5061027e61043336600461373b565b610be1565b34801561044457600080fd5b506104586104533660046134e4565b610c76565b60405161022591906137d9565b34801561047157600080fd5b5061027e61048036600461386d565b610e81565b34801561049157600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104da57600080fd5b5061027e61119b565b3480156104ef57600080fd5b5061027e6104fe3660046138e9565b611298565b34801561050f57600080fd5b5061027e61051e366004613955565b6115f9565b34801561052f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561055a57600080fd5b5061027e6105693660046135fb565b611906565b34801561057a57600080fd5b5061027e610589366004613990565b6119c1565b34801561059a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610357565b3480156105c557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105fd57600080fd5b5061027e61060c3660046139d2565b611d57565b34801561061d57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561064657600080fd5b5061027e610655366004613955565b611ec7565b34801561066657600080fd5b5061027e6106753660046134e4565b6120e4565b6103ea610688366004613b35565b61234e565b34801561069957600080fd5b5061027e6106a83660046135fb565b612884565b3480156106b957600080fd5b506008546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613c42565b9081526040519081900360200190205460ff1690509392505050565b61072d612898565b60085473ffffffffffffffffffffffffffffffffffffffff161561078e5761078e61076d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612919565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561083b5761083b6107fb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b19565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108a1612898565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6108fb612898565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61093e612898565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109706001612c1d565b565b60036020526000908152604090208054819061098d90613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990613c52565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505090806001018054610a1b90613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613c52565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905082565b610aa6612898565b73ffffffffffffffffffffffffffffffffffffffff8116610af3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610b77600583612d2a565b92915050565b610b85612898565b610b8f8282612d3d565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610be9612898565b610c0a73ffffffffffffffffffffffffffffffffffffffff84168383612e97565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610c6991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ce590613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190613c52565b8015610d5e5780601f10610d3357610100808354040283529160200191610d5e565b820191906000526020600020905b815481529060010190602001808311610d4157829003601f168201915b50505050508152602001600382018054610d7790613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613c52565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e1e565b505050915250909392505050565b610e89612898565b6001610e96600584612d2a565b14610ed5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ee58260025b60059190612eed565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f2d90613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990613c52565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b50505050508152602001600382018054610fbf90613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb90613c52565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110bb5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611066565b5050505081525050905060005b81608001515181101561114a5761114283836080015183815181106110ef576110ef613ca5565b6020026020010151602001518460800151848151811061111157611111613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e979092919063ffffffff16565b6001016110c8565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ecc565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112a0612898565b60005b8181101561144357600360008484848181106112c1576112c1613ca5565b90506020028101906112d39190613cd4565b6112e19060208101906136c4565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061131857611318613ca5565b905060200281019061132a9190613cd4565b611338906020810190613d12565b604051611346929190613c42565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061138d5761138d613ca5565b905060200281019061139f9190613cd4565b6113ad906020810190613d12565b6040516113bb929190613c42565b60405180910390208383838181106113d5576113d5613ca5565b90506020028101906113e79190613cd4565b6113f59060208101906136c4565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611433911515815260200190565b60405180910390a36001016112a3565b5060005b838110156115f25760016003600087878581811061146757611467613ca5565b90506020028101906114799190613cd4565b6114879060208101906136c4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106114be576114be613ca5565b90506020028101906114d09190613cd4565b6114de906020810190613d12565b6040516114ec929190613c42565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061153c5761153c613ca5565b905060200281019061154e9190613cd4565b61155c906020810190613d12565b60405161156a929190613c42565b604051809103902085858381811061158457611584613ca5565b90506020028101906115969190613cd4565b6115a49060208101906136c4565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516115e2911515815260200190565b60405180910390a3600101611447565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461164c576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ecc565b61165c60408201602083016136c4565b6116696040830183613d12565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116c092509050613c52565b159050806117165750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117019190613d77565b9081526040519081900360200190205460ff16155b1561174f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc91906136b1565b61175f60408401602085016136c4565b67ffffffffffffffff811660009081526003602052604090208054819061178590613c52565b90506000036117cc576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611808908890600401613e8b565b600060405180830381600087803b15801561182257600080fd5b505af1925050508015611833575060015b6118d3573d808015611861576040519150601f19603f3d011682016040523d82523d6000602084013e611866565b606091505b5061187386356001610edc565b50853560009081526004602052604090208690611890828261425d565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906118c59084906136b1565b60405180910390a2506115f2565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b61190e612898565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906119bd9082614357565b5050565b6119c9612898565b60005b81811015611d52578282828181106119e6576119e6613ca5565b90506020028101906119f89190614471565b611a09906040810190602001613626565b611ad55760036000848484818110611a2357611a23613ca5565b9050602002810190611a359190614471565b611a439060208101906136c4565b67ffffffffffffffff16815260208101919091526040016000908120611a6891613496565b828282818110611a7a57611a7a613ca5565b9050602002810190611a8c9190614471565b611a9a9060208101906136c4565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611d4a565b828282818110611ae757611ae7613ca5565b9050602002810190611af99190614471565b611b07906040810190613d12565b9050600003611b42576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611b5a57611b5a613ca5565b9050602002810190611b6c9190614471565b611b7a9060208101906136c4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611bb057611bb0613ca5565b9050602002810190611bc29190614471565b611bd0906040810190613d12565b8291611bdd919083613fe1565b50838383818110611bf057611bf0613ca5565b9050602002810190611c029190614471565b611c10906060810190613d12565b159050611c5b57838383818110611c2957611c29613ca5565b9050602002810190611c3b9190614471565b611c49906060810190613d12565b6001830191611c59919083613fe1565b505b838383818110611c6d57611c6d613ca5565b9050602002810190611c7f9190614471565b611c8d906040810190613d12565b604051611c9b929190613c42565b6040518091039020848484818110611cb557611cb5613ca5565b9050602002810190611cc79190614471565b611cd59060208101906136c4565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611d1257611d12613ca5565b9050602002810190611d249190614471565b611d32906060810190613d12565b604051611d409291906144a5565b60405180910390a3505b6001016119cc565b505050565b611d5f612898565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611e1a91613d77565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611d529082614357565b333014611f00576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f1060408201602083016136c4565b611f1d6040830183613d12565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611f7492509050613c52565b15905080611fca5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611fb59190613d77565b9081526040519081900360200190205460ff16155b1561200357806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ecc91906136b1565b61201360408401602085016136c4565b67ffffffffffffffff811660009081526003602052604090208054819061203990613c52565b9050600003612080576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b600061208f6060870187613d12565b81019061209c91906134e4565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff166120dc576120dc6120d78260016144b9565b612c1d565b505050505050565b60016120f1600583612d2a565b1461212b576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ecc565b612136816000610edc565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161217e90613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546121aa90613c52565b80156121f75780601f106121cc576101008083540402835291602001916121f7565b820191906000526020600020905b8154815290600101906020018083116121da57829003601f168201915b5050505050815260200160038201805461221090613c52565b80601f016020809104026020016040519081016040528092919081815260200182805461223c90613c52565b80156122895780601f1061225e57610100808354040283529160200191612289565b820191906000526020600020905b81548152906001019060200180831161226c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561230c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016122b7565b5050505081525050905061231f81612f02565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061237790613c52565b90506000036123be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ecc565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906123ee90613c52565b80601f016020809104026020016040519081016040528092919081815260200182805461241a90613c52565b80156124675780601f1061243c57610100808354040283529160200191612467565b820191906000526020600020905b81548152906001019060200180831161244a57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916124c890613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546124f490613c52565b80156125415780601f1061251657610100808354040283529160200191612541565b820191906000526020600020905b81548152906001019060200180831161252457829003601f168201915b5050505050815250905060005b865181101561269e576125be333089848151811061256e5761256e613ca5565b6020026020010151602001518a858151811061258c5761258c613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612f0a909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106125ee576125ee613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126965760025487516126969173ffffffffffffffffffffffffffffffffffffffff169089908490811061264757612647613ca5565b60200260200101516020015189848151811061266557612665613ca5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129199092919063ffffffff16565b60010161254e565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906126f8908b9086906004016144cc565b602060405180830381865afa158015612715573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127399190614599565b60085490915073ffffffffffffffffffffffffffffffffffffffff161561277f5760085461277f9073ffffffffffffffffffffffffffffffffffffffff16333084612f0a565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156127b15760006127b3565b825b8a856040518463ffffffff1660e01b81526004016127d29291906144cc565b60206040518083038185885af11580156127f0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128159190614599565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61288c612898565b61289581612f68565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ecc565b8015806129b957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b79190614599565b155b612a45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d529084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261305d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb49190614599565b612bbe91906144b9565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612c179085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a97565b50505050565b80600116600103612c60576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612c94565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b600081604051602001612ca991815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a54600080855260208501909352909350611d529267ffffffffffffffff90911691612d23565b6040805180820190915260008082526020820152815260200190600190039081612cfc5790505b508361234e565b6000612d368383613169565b9392505050565b80471015612da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ecc565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e01576040519150601f19603f3d011682016040523d82523d6000602084013e612e06565b606091505b5050905080611d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ecc565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d529084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a97565b6000612efa8484846131f3565b949350505050565b612895612898565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612c179085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a97565b3373ffffffffffffffffffffffffffffffffffffffff821603612fe7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ecc565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006130bf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132109092919063ffffffff16565b805190915015611d5257808060200190518101906130dd91906145b2565b611d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecc565b60008181526002830160205260408120548015158061318d575061318d848461321f565b612d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ecc565b60008281526002840160205260408120829055612efa848461322b565b6060612efa8484600085613237565b6000612d368383613350565b6000612d368383613368565b6060824710156132c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ecc565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132f29190613d77565b60006040518083038185875af1925050503d806000811461332f576040519150601f19603f3d011682016040523d82523d6000602084013e613334565b606091505b5091509150613345878383876133b7565b979650505050505050565b60008181526001830160205260408120541515612d36565b60008181526001830160205260408120546133af57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b77565b506000610b77565b6060831561344d5782516000036134465773ffffffffffffffffffffffffffffffffffffffff85163b613446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecc565b5081612efa565b612efa83838151156134625781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc91906136b1565b5080546134a290613c52565b6000825580601f106134b2575050565b601f01602090049060005260206000209081019061289591905b808211156134e057600081556001016134cc565b5090565b6000602082840312156134f657600080fd5b5035919050565b6020810160038310613538577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461289557600080fd5b60008060006040848603121561356957600080fd5b83356135748161353e565b9250602084013567ffffffffffffffff8082111561359157600080fd5b818601915086601f8301126135a557600080fd5b8135818111156135b457600080fd5b8760208285010111156135c657600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff8116811461289557600080fd5b60006020828403121561360d57600080fd5b8135612d36816135d9565b801515811461289557600080fd5b60006020828403121561363857600080fd5b8135612d3681613618565b60005b8381101561365e578181015183820152602001613646565b50506000910152565b6000815180845261367f816020860160208601613643565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d366020830184613667565b6000602082840312156136d657600080fd5b8135612d368161353e565b6040815260006136f46040830185613667565b82810360208401526137068185613667565b95945050505050565b6000806040838503121561372257600080fd5b823561372d816135d9565b946020939093013593505050565b60008060006060848603121561375057600080fd5b833561375b816135d9565b9250602084013561376b816135d9565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156137ce578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613791565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261381360c0840182613667565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261384f8383613667565b925060808601519150808584030160a086015250613706828261377c565b6000806040838503121561388057600080fd5b823591506020830135613892816135d9565b809150509250929050565b60008083601f8401126138af57600080fd5b50813567ffffffffffffffff8111156138c757600080fd5b6020830191508360208260051b85010111156138e257600080fd5b9250929050565b600080600080604085870312156138ff57600080fd5b843567ffffffffffffffff8082111561391757600080fd5b6139238883890161389d565b9096509450602087013591508082111561393c57600080fd5b506139498782880161389d565b95989497509550505050565b60006020828403121561396757600080fd5b813567ffffffffffffffff81111561397e57600080fd5b820160a08185031215612d3657600080fd5b600080602083850312156139a357600080fd5b823567ffffffffffffffff8111156139ba57600080fd5b6139c68582860161389d565b90969095509350505050565b600080604083850312156139e557600080fd5b82356139f08161353e565b91506020830135613892816135d9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a5257613a52613a00565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a9f57613a9f613a00565b604052919050565b600082601f830112613ab857600080fd5b813567ffffffffffffffff811115613ad257613ad2613a00565b613b0360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613a58565b818152846020838601011115613b1857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b4a57600080fd5b8335613b558161353e565b925060208481013567ffffffffffffffff80821115613b7357600080fd5b818701915087601f830112613b8757600080fd5b813581811115613b9957613b99613a00565b613ba7848260051b01613a58565b81815260069190911b8301840190848101908a831115613bc657600080fd5b938501935b82851015613c12576040858c031215613be45760008081fd5b613bec613a2f565b8535613bf7816135d9565b81528587013587820152825260409094019390850190613bcb565b965050506040870135925080831115613c2a57600080fd5b5050613c3886828701613aa7565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613c6657607f821691505b602082108103613c9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613d0857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d4757600080fd5b83018035915067ffffffffffffffff821115613d6257600080fd5b6020019150368190038213156138e257600080fd5b60008251613d08818460208701613643565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613dbe57600080fd5b830160208101925035905067ffffffffffffffff811115613dde57600080fd5b8036038213156138e257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156137ce578135613e59816135d9565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613e46565b602081528135602082015260006020830135613ea68161353e565b67ffffffffffffffff8082166040850152613ec46040860186613d89565b925060a06060860152613edb60c086018483613ded565b925050613eeb6060860186613d89565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f21858385613ded565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613f5a57600080fd5b60209288019283019235915083821115613f7357600080fd5b8160061b3603831315613f8557600080fd5b8685030160a0870152613345848284613e36565b601f821115611d52576000816000526020600020601f850160051c81016020861015613fc25750805b601f850160051c820191505b818110156120dc57828155600101613fce565b67ffffffffffffffff831115613ff957613ff9613a00565b61400d836140078354613c52565b83613f99565b6000601f84116001811461405f57600085156140295750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115f2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140ae578685013582556020948501946001909201910161408e565b50868210156140e9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135614135816135d9565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561419b5761419b613a00565b8054838255808410156142285760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146141dc576141dc6140fb565b80861686146141ed576141ed6140fb565b5060008360005260206000208360011b81018760011b820191505b80821015614223578282558284830155600282019150614208565b505050505b5060008181526020812083915b858110156120dc57614247838361412a565b6040929092019160029190910190600101614235565b813581556001810160208301356142738161353e565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556142b36040860186613d12565b935091506142c5838360028701613fe1565b6142d26060860186613d12565b935091506142e4838360038701613fe1565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261431b57600080fd5b91840191823591508082111561433057600080fd5b506020820191508060061b360382131561434957600080fd5b612c17818360048601614182565b815167ffffffffffffffff81111561437157614371613a00565b6143858161437f8454613c52565b84613f99565b602080601f8311600181146143d857600084156143a25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556120dc565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561442557888601518255948401946001909101908401614406565b508582101561446157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d0857600080fd5b602081526000612efa602083018486613ded565b80820180821115610b7757610b776140fb565b67ffffffffffffffff83168152604060208201526000825160a060408401526144f860e0840182613667565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145348383613667565b92506040860151915080858403016080860152614551838361377c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061458f8282613667565b9695505050505050565b6000602082840312156145ab57600080fd5b5051919050565b6000602082840312156145c457600080fd5b8151612d368161361856fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bbf38038062004bbf83398101604081905262000034916200056d565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000149565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013d576200013d6001600160a01b03821683600019620001f4565b50505050505062000692565b336001600160a01b03821603620001a35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c9190620005ac565b620002789190620005c6565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d491869190620002da16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000329906001600160a01b038516908490620003b0565b805190915015620003ab57808060200190518101906200034a9190620005ee565b620003ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003c18484600085620003c9565b949350505050565b6060824710156200042c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b031685876040516200044a91906200063f565b60006040518083038185875af1925050503d806000811462000489576040519150601f19603f3d011682016040523d82523d6000602084013e6200048e565b606091505b509092509050620004a287838387620004ad565b979650505050505050565b606083156200052157825160000362000519576001600160a01b0385163b620005195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003c1565b620003c18383815115620005385781518083602001fd5b8060405162461bcd60e51b81526004016200008891906200065d565b6001600160a01b03811681146200056a57600080fd5b50565b600080604083850312156200058157600080fd5b82516200058e8162000554565b6020840151909250620005a18162000554565b809150509250929050565b600060208284031215620005bf57600080fd5b5051919050565b80820180821115620005e857634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060157600080fd5b815180151581146200061257600080fd5b9392505050565b60005b83811015620006365781810151838201526020016200061c565b50506000910152565b600082516200065381846020870162000619565b9190910192915050565b60208152600082518060208401526200067e81604085016020870162000619565b601f01601f19169190910160400192915050565b61451d80620006a26000396000f3fe6080604052600436106101dc5760003560e01c806379ba509711610102578063b5a1101111610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063b5a11011146105d1578063bee518a4146105f1578063c851cc321461061a578063cf6730f81461063a57600080fd5b80639d2aede5116100d15780639d2aede51461052e5780639fe74e261461054e578063b0f479a11461056e578063b187bd261461059957600080fd5b806379ba5097146104ae5780638462a2b9146104c357806385572ffb146104e35780638da5cb5b1461050357600080fd5b80632b6e5d631161017a5780635e35359e116101495780635e35359e146103f85780636939cd97146104185780636d62d633146104455780636fef519e1461046557600080fd5b80632b6e5d631461032457806335f170ef1461037c5780635075a9d4146103aa578063536c6bfa146103d857600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004613425565b60096020526000908152604090205460ff1681565b604051610225919061343e565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613495565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461353c565b610725565b005b34801561028c57600080fd5b5061027e61029b366004613567565b610899565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906135f2565b3480156102fb57600080fd5b5061027e61030a366004613605565b6108f3565b34801561031b57600080fd5b5061027e610936565b34801561033057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c610397366004613605565b610972565b604051610225929190613622565b3480156103b657600080fd5b506103ca6103c5366004613425565b610a9e565b604051908152602001610225565b3480156103e457600080fd5b5061027e6103f3366004613650565b610ab1565b34801561040457600080fd5b5061027e61041336600461367c565b610b15565b34801561042457600080fd5b50610438610433366004613425565b610baa565b604051610225919061371a565b34801561045157600080fd5b5061027e6104603660046137ae565b610db5565b34801561047157600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104ba57600080fd5b5061027e6110cf565b3480156104cf57600080fd5b5061027e6104de36600461382a565b6111cc565b3480156104ef57600080fd5b5061027e6104fe366004613896565b61150d565b34801561050f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561053a57600080fd5b5061027e61054936600461353c565b611716565b34801561055a57600080fd5b5061027e6105693660046138d1565b6117d1565b34801561057a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610357565b3480156105a557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105dd57600080fd5b5061027e6105ec366004613913565b611b62565b3480156105fd57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561062657600080fd5b5061027e61063536600461353c565b611cd2565b34801561064657600080fd5b5061027e610655366004613896565b611d9e565b34801561066657600080fd5b5061027e610675366004613425565b611fbb565b6103ca610688366004613a76565b612225565b34801561069957600080fd5b5061027e6106a836600461353c565b61275b565b3480156106b957600080fd5b506008546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613b83565b9081526040519081900360200190205460ff1690509392505050565b61072d61276f565b60085473ffffffffffffffffffffffffffffffffffffffff161561078e5761078e61076d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006127f0565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561083b5761083b6107fb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6129f0565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108a161276f565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6108fb61276f565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61093e61276f565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109706001612af4565b565b60036020526000908152604090208054819061098d90613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990613b93565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505090806001018054610a1b90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613b93565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905082565b6000610aab600583612c01565b92915050565b610ab961276f565b610ac38282612c14565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610b1d61276f565b610b3e73ffffffffffffffffffffffffffffffffffffffff84168383612d6e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610b9d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c1990613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4590613b93565b8015610c925780601f10610c6757610100808354040283529160200191610c92565b820191906000526020600020905b815481529060010190602001808311610c7557829003601f168201915b50505050508152602001600382018054610cab90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790613b93565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610da75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d52565b505050915250909392505050565b610dbd61276f565b6001610dca600584612c01565b14610e09576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e198260025b60059190612dc4565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e6190613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8d90613b93565b8015610eda5780601f10610eaf57610100808354040283529160200191610eda565b820191906000526020600020905b815481529060010190602001808311610ebd57829003601f168201915b50505050508152602001600382018054610ef390613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1f90613b93565b8015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610fef5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f9a565b5050505081525050905060005b81608001515181101561107e57611076838360800151838151811061102357611023613be6565b6020026020010151602001518460800151848151811061104557611045613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6e9092919063ffffffff16565b600101610ffc565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e00565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111d461276f565b60005b8181101561136757600360008484848181106111f5576111f5613be6565b90506020028101906112079190613c15565b611215906020810190613605565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061124c5761124c613be6565b905060200281019061125e9190613c15565b61126c906020810190613c53565b60405161127a929190613b83565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106112c1576112c1613be6565b90506020028101906112d39190613c15565b6112e1906020810190613c53565b6040516112ef929190613b83565b604051809103902083838381811061130957611309613be6565b905060200281019061131b9190613c15565b611329906020810190613605565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016111d7565b5060005b838110156115065760016003600087878581811061138b5761138b613be6565b905060200281019061139d9190613c15565b6113ab906020810190613605565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106113e2576113e2613be6565b90506020028101906113f49190613c15565b611402906020810190613c53565b604051611410929190613b83565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061146057611460613be6565b90506020028101906114729190613c15565b611480906020810190613c53565b60405161148e929190613b83565b60405180910390208585838181106114a8576114a8613be6565b90506020028101906114ba9190613c15565b6114c8906020810190613605565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161136b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611560576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e00565b6115706040820160208301613605565b67ffffffffffffffff811660009081526003602052604090208054819061159690613b93565b90506000036115dd576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e00565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611619908690600401613dba565b600060405180830381600087803b15801561163357600080fd5b505af1925050508015611644575060015b6116e4573d808015611672576040519150601f19603f3d011682016040523d82523d6000602084013e611677565b606091505b5061168484356001610e10565b508335600090815260046020526040902084906116a1828261418c565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116d69084906135f2565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61171e61276f565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906117cd9082614286565b5050565b6117d961276f565b60005b81811015611711578282828181106117f6576117f6613be6565b905060200281019061180891906143a0565b611819906040810190602001613567565b6118e5576003600084848481811061183357611833613be6565b905060200281019061184591906143a0565b611853906020810190613605565b67ffffffffffffffff16815260208101919091526040016000908120611878916133d7565b82828281811061188a5761188a613be6565b905060200281019061189c91906143a0565b6118aa906020810190613605565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611b5a565b8282828181106118f7576118f7613be6565b905060200281019061190991906143a0565b611917906040810190613c53565b9050600003611952576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061196a5761196a613be6565b905060200281019061197c91906143a0565b61198a906020810190613605565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106119c0576119c0613be6565b90506020028101906119d291906143a0565b6119e0906040810190613c53565b82916119ed919083613f10565b50838383818110611a0057611a00613be6565b9050602002810190611a1291906143a0565b611a20906060810190613c53565b159050611a6b57838383818110611a3957611a39613be6565b9050602002810190611a4b91906143a0565b611a59906060810190613c53565b6001830191611a69919083613f10565b505b838383818110611a7d57611a7d613be6565b9050602002810190611a8f91906143a0565b611a9d906040810190613c53565b604051611aab929190613b83565b6040518091039020848484818110611ac557611ac5613be6565b9050602002810190611ad791906143a0565b611ae5906020810190613605565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611b2257611b22613be6565b9050602002810190611b3491906143a0565b611b42906060810190613c53565b604051611b509291906143d4565b60405180910390a3505b6001016117dc565b611b6a61276f565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611c25916143e8565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906117119082614286565b611cda61276f565b73ffffffffffffffffffffffffffffffffffffffff8116611d27576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b333014611dd7576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611de76040820160208301613605565b611df46040830183613c53565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611e4b92509050613b93565b15905080611ea15750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e8c91906143e8565b9081526040519081900360200190205460ff16155b15611eda57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e0091906135f2565b611eea6040840160208501613605565b67ffffffffffffffff8116600090815260036020526040902080548190611f1090613b93565b9050600003611f57576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e00565b6000611f666060870187613c53565b810190611f739190613425565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611fb357611fb3611fae8260016143fa565b612af4565b505050505050565b6001611fc8600583612c01565b14612002576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e00565b61200d816000610e10565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161205590613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461208190613b93565b80156120ce5780601f106120a3576101008083540402835291602001916120ce565b820191906000526020600020905b8154815290600101906020018083116120b157829003601f168201915b505050505081526020016003820180546120e790613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461211390613b93565b80156121605780601f1061213557610100808354040283529160200191612160565b820191906000526020600020905b81548152906001019060200180831161214357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156121e35760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161218e565b505050508152505090506121f681612dd9565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061224e90613b93565b9050600003612295576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e00565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906122c590613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546122f190613b93565b801561233e5780601f106123135761010080835404028352916020019161233e565b820191906000526020600020905b81548152906001019060200180831161232157829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161239f90613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546123cb90613b93565b80156124185780601f106123ed57610100808354040283529160200191612418565b820191906000526020600020905b8154815290600101906020018083116123fb57829003601f168201915b5050505050815250905060005b865181101561257557612495333089848151811061244557612445613be6565b6020026020010151602001518a858151811061246357612463613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e4b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106124c5576124c5613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461256d57600254875161256d9173ffffffffffffffffffffffffffffffffffffffff169089908490811061251e5761251e613be6565b60200260200101516020015189848151811061253c5761253c613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127f09092919063ffffffff16565b600101612425565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906125cf908b90869060040161440d565b602060405180830381865afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261091906144da565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612656576008546126569073ffffffffffffffffffffffffffffffffffffffff16333084612e4b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561268857600061268a565b825b8a856040518463ffffffff1660e01b81526004016126a992919061440d565b60206040518083038185885af11580156126c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126ec91906144da565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61276361276f565b61276c81612ea9565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e00565b80158061289057506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561286a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288e91906144da565b155b61291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e00565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117119084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f9e565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b91906144da565b612a9591906143fa565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612aee9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161296e565b50505050565b80600116600103612b37576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b6b565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b600081604051602001612b8091815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a546000808552602085019093529093506117119267ffffffffffffffff90911691612bfa565b6040805180820190915260008082526020820152815260200190600190039081612bd35790505b5083612225565b6000612c0d83836130aa565b9392505050565b80471015612c7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e00565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd8576040519150601f19603f3d011682016040523d82523d6000602084013e612cdd565b606091505b5050905080611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e00565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117119084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161296e565b6000612dd1848484613134565b949350505050565b612de161276f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e1d90849060040161371a565b600060405180830381600087803b158015612e3757600080fd5b505af1158015611506573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aee9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161296e565b3373ffffffffffffffffffffffffffffffffffffffff821603612f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e00565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613000826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131519092919063ffffffff16565b805190915015611711578080602001905181019061301e91906144f3565b611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e00565b6000818152600283016020526040812054801515806130ce57506130ce8484613160565b612c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e00565b60008281526002840160205260408120829055612dd1848461316c565b6060612dd18484600085613178565b6000612c0d8383613291565b6000612c0d83836132a9565b60608247101561320a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e00565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161323391906143e8565b60006040518083038185875af1925050503d8060008114613270576040519150601f19603f3d011682016040523d82523d6000602084013e613275565b606091505b5091509150613286878383876132f8565b979650505050505050565b60008181526001830160205260408120541515612c0d565b60008181526001830160205260408120546132f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aab565b506000610aab565b6060831561338e5782516000036133875773ffffffffffffffffffffffffffffffffffffffff85163b613387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e00565b5081612dd1565b612dd183838151156133a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0091906135f2565b5080546133e390613b93565b6000825580601f106133f3575050565b601f01602090049060005260206000209081019061276c91905b80821115613421576000815560010161340d565b5090565b60006020828403121561343757600080fd5b5035919050565b6020810160038310613479577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461276c57600080fd5b6000806000604084860312156134aa57600080fd5b83356134b58161347f565b9250602084013567ffffffffffffffff808211156134d257600080fd5b818601915086601f8301126134e657600080fd5b8135818111156134f557600080fd5b87602082850101111561350757600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff8116811461276c57600080fd5b60006020828403121561354e57600080fd5b8135612c0d8161351a565b801515811461276c57600080fd5b60006020828403121561357957600080fd5b8135612c0d81613559565b60005b8381101561359f578181015183820152602001613587565b50506000910152565b600081518084526135c0816020860160208601613584565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0d60208301846135a8565b60006020828403121561361757600080fd5b8135612c0d8161347f565b60408152600061363560408301856135a8565b828103602084015261364781856135a8565b95945050505050565b6000806040838503121561366357600080fd5b823561366e8161351a565b946020939093013593505050565b60008060006060848603121561369157600080fd5b833561369c8161351a565b925060208401356136ac8161351a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561370f578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136d2565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261375460c08401826135a8565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261379083836135a8565b925060808601519150808584030160a08601525061364782826136bd565b600080604083850312156137c157600080fd5b8235915060208301356137d38161351a565b809150509250929050565b60008083601f8401126137f057600080fd5b50813567ffffffffffffffff81111561380857600080fd5b6020830191508360208260051b850101111561382357600080fd5b9250929050565b6000806000806040858703121561384057600080fd5b843567ffffffffffffffff8082111561385857600080fd5b613864888389016137de565b9096509450602087013591508082111561387d57600080fd5b5061388a878288016137de565b95989497509550505050565b6000602082840312156138a857600080fd5b813567ffffffffffffffff8111156138bf57600080fd5b820160a08185031215612c0d57600080fd5b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b613907858286016137de565b90969095509350505050565b6000806040838503121561392657600080fd5b82356139318161347f565b915060208301356137d38161351a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561399357613993613941565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e0576139e0613941565b604052919050565b600082601f8301126139f957600080fd5b813567ffffffffffffffff811115613a1357613a13613941565b613a4460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613999565b818152846020838601011115613a5957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8b57600080fd5b8335613a968161347f565b925060208481013567ffffffffffffffff80821115613ab457600080fd5b818701915087601f830112613ac857600080fd5b813581811115613ada57613ada613941565b613ae8848260051b01613999565b81815260069190911b8301840190848101908a831115613b0757600080fd5b938501935b82851015613b53576040858c031215613b255760008081fd5b613b2d613970565b8535613b388161351a565b81528587013587820152825260409094019390850190613b0c565b965050506040870135925080831115613b6b57600080fd5b5050613b79868287016139e8565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613ba757607f821691505b602082108103613be0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c4957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c8857600080fd5b83018035915067ffffffffffffffff821115613ca357600080fd5b60200191503681900382131561382357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ced57600080fd5b830160208101925035905067ffffffffffffffff811115613d0d57600080fd5b80360382131561382357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561370f578135613d888161351a565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d75565b602081528135602082015260006020830135613dd58161347f565b67ffffffffffffffff8082166040850152613df36040860186613cb8565b925060a06060860152613e0a60c086018483613d1c565b925050613e1a6060860186613cb8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e50858385613d1c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e8957600080fd5b60209288019283019235915083821115613ea257600080fd5b8160061b3603831315613eb457600080fd5b8685030160a0870152613286848284613d65565b601f821115611711576000816000526020600020601f850160051c81016020861015613ef15750805b601f850160051c820191505b81811015611fb357828155600101613efd565b67ffffffffffffffff831115613f2857613f28613941565b613f3c83613f368354613b93565b83613ec8565b6000601f841160018114613f8e5760008515613f585750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611506565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fdd5786850135825560209485019460019092019101613fbd565b5086821015614018577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356140648161351a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140ca576140ca613941565b8054838255808410156141575760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410b5761410b61402a565b808616861461411c5761411c61402a565b5060008360005260206000208360011b81018760011b820191505b80821015614152578282558284830155600282019150614137565b505050505b5060008181526020812083915b85811015611fb3576141768383614059565b6040929092019160029190910190600101614164565b813581556001810160208301356141a28161347f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141e26040860186613c53565b935091506141f4838360028701613f10565b6142016060860186613c53565b93509150614213838360038701613f10565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424a57600080fd5b91840191823591508082111561425f57600080fd5b506020820191508060061b360382131561427857600080fd5b612aee8183600486016140b1565b815167ffffffffffffffff8111156142a0576142a0613941565b6142b4816142ae8454613b93565b84613ec8565b602080601f83116001811461430757600084156142d15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611fb3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561435457888601518255948401946001909101908401614335565b508582101561439057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c4957600080fd5b602081526000612dd1602083018486613d1c565b60008251613c49818460208701613584565b80820180821115610aab57610aab61402a565b67ffffffffffffffff83168152604060208201526000825160a0604084015261443960e08401826135a8565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261447583836135a8565b9250604086015191508085840301608086015261449283836136bd565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144d082826135a8565b9695505050505050565b6000602082840312156144ec57600080fd5b5051919050565b60006020828403121561450557600080fd5b8151612c0d8161355956fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -562,18 +562,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) ModifyFeeToken(token common. return _PingPongDemo.Contract.ModifyFeeToken(&_PingPongDemo.TransactOpts, token) } -func (_PingPongDemo *PingPongDemoTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "modifyRouter", newRouter) -} - -func (_PingPongDemo *PingPongDemoSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.ModifyRouter(&_PingPongDemo.TransactOpts, newRouter) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.ModifyRouter(&_PingPongDemo.TransactOpts, newRouter) -} - func (_PingPongDemo *PingPongDemoTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "processMessage", message) } @@ -682,6 +670,18 @@ func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds [ return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) } +func (_PingPongDemo *PingPongDemoTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateRouter(&_PingPongDemo.TransactOpts, newRouter) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateRouter(&_PingPongDemo.TransactOpts, newRouter) +} + func (_PingPongDemo *PingPongDemoTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "withdrawNativeToken", to, amount) } @@ -718,8 +718,144 @@ func (_PingPongDemo *PingPongDemoTransactorSession) Receive() (*types.Transactio return _PingPongDemo.Contract.Receive(&_PingPongDemo.TransactOpts) } -type PingPongDemoApprovedSenderModifiedIterator struct { - Event *PingPongDemoApprovedSenderModified +type PingPongDemoApprovedSenderAddedIterator struct { + Event *PingPongDemoApprovedSenderAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoApprovedSenderAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoApprovedSenderAdded) + 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(PingPongDemoApprovedSenderAdded) + 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 *PingPongDemoApprovedSenderAddedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoApprovedSenderAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoApprovedSenderAdded struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderAddedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &PingPongDemoApprovedSenderAddedIterator{contract: _PingPongDemo.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoApprovedSenderAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderAdded", 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) ParseApprovedSenderAdded(log types.Log) (*PingPongDemoApprovedSenderAdded, error) { + event := new(PingPongDemoApprovedSenderAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoApprovedSenderRemovedIterator struct { + Event *PingPongDemoApprovedSenderRemoved contract *bind.BoundContract event string @@ -730,7 +866,7 @@ type PingPongDemoApprovedSenderModifiedIterator struct { fail error } -func (it *PingPongDemoApprovedSenderModifiedIterator) Next() bool { +func (it *PingPongDemoApprovedSenderRemovedIterator) Next() bool { if it.fail != nil { return false @@ -739,7 +875,7 @@ func (it *PingPongDemoApprovedSenderModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoApprovedSenderModified) + it.Event = new(PingPongDemoApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -754,7 +890,7 @@ func (it *PingPongDemoApprovedSenderModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoApprovedSenderModified) + it.Event = new(PingPongDemoApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -769,23 +905,22 @@ func (it *PingPongDemoApprovedSenderModifiedIterator) Next() bool { } } -func (it *PingPongDemoApprovedSenderModifiedIterator) Error() error { +func (it *PingPongDemoApprovedSenderRemovedIterator) Error() error { return it.fail } -func (it *PingPongDemoApprovedSenderModifiedIterator) Close() error { +func (it *PingPongDemoApprovedSenderRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoApprovedSenderModified struct { +type PingPongDemoApprovedSenderRemoved struct { DestChainSelector uint64 Recipient common.Hash - IsBeingApproved bool Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderModifiedIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderRemovedIterator, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -796,14 +931,14 @@ func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderModified(opts *bi recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &PingPongDemoApprovedSenderModifiedIterator{contract: _PingPongDemo.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil + return &PingPongDemoApprovedSenderRemovedIterator{contract: _PingPongDemo.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -814,7 +949,7 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderModified(opts *bin recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -824,8 +959,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderModified(opts *bin select { case log := <-logs: - event := new(PingPongDemoApprovedSenderModified) - if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + event := new(PingPongDemoApprovedSenderRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return err } event.Raw = log @@ -846,9 +981,9 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderModified(opts *bin }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParseApprovedSenderModified(log types.Log) (*PingPongDemoApprovedSenderModified, error) { - event := new(PingPongDemoApprovedSenderModified) - if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseApprovedSenderRemoved(log types.Log) (*PingPongDemoApprovedSenderRemoved, error) { + event := new(PingPongDemoApprovedSenderRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log @@ -1580,8 +1715,8 @@ func (it *PingPongDemoMessageAckReceivedIterator) Close() error { } type PingPongDemoMessageAckReceived struct { - Arg0 [32]byte - Raw types.Log + MessageId [32]byte + Raw types.Log } func (_PingPongDemo *PingPongDemoFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*PingPongDemoMessageAckReceivedIterator, error) { @@ -2921,8 +3056,10 @@ type SChainConfigs struct { func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { - case _PingPongDemo.abi.Events["ApprovedSenderModified"].ID: - return _PingPongDemo.ParseApprovedSenderModified(log) + case _PingPongDemo.abi.Events["ApprovedSenderAdded"].ID: + return _PingPongDemo.ParseApprovedSenderAdded(log) + case _PingPongDemo.abi.Events["ApprovedSenderRemoved"].ID: + return _PingPongDemo.ParseApprovedSenderRemoved(log) case _PingPongDemo.abi.Events["CCIPRouterModified"].ID: return _PingPongDemo.ParseCCIPRouterModified(log) case _PingPongDemo.abi.Events["ChainAdded"].ID: @@ -2961,8 +3098,12 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, } } -func (PingPongDemoApprovedSenderModified) Topic() common.Hash { - return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +func (PingPongDemoApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (PingPongDemoApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") } func (PingPongDemoCCIPRouterModified) Topic() common.Hash { @@ -3074,8 +3215,6 @@ type PingPongDemoInterface interface { ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) - ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) @@ -3094,17 +3233,25 @@ type PingPongDemoInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) - FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderModifiedIterator, error) + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*PingPongDemoApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderRemovedIterator, error) - WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) - ParseApprovedSenderModified(log types.Log) (*PingPongDemoApprovedSenderModified, error) + ParseApprovedSenderRemoved(log types.Log) (*PingPongDemoApprovedSenderRemoved, error) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*PingPongDemoCCIPRouterModifiedIterator, 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 5b3f57c4dc..a27035de08 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBeingApproved\",\"type\":\"bool\"}],\"name\":\"ApprovedSenderModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"modifyRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.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: "0x60806040523480156200001157600080fd5b50604051620051fc380380620051fc83398101604081905262000034916200059f565b828281818181818181803380600081620000955760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c857620000c8816200017b565b5050506001600160a01b038116620000f3576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200014157620001416001600160a01b0382168360001962000226565b50505050505050508060026200015891906200060e565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070e565b336001600160a01b03821603620001d55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008c565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e919062000634565b620002aa91906200064e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000306918691906200030c16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200035b906001600160a01b038516908490620003e2565b805190915015620003dd57808060200190518101906200037c91906200066a565b620003dd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008c565b505050565b6060620003f38484600085620003fb565b949350505050565b6060824710156200045e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008c565b600080866001600160a01b031685876040516200047c9190620006bb565b60006040518083038185875af1925050503d8060008114620004bb576040519150601f19603f3d011682016040523d82523d6000602084013e620004c0565b606091505b509092509050620004d487838387620004df565b979650505050505050565b60608315620005535782516000036200054b576001600160a01b0385163b6200054b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008c565b5081620003f3565b620003f383838151156200056a5781518083602001fd5b8060405162461bcd60e51b81526004016200008c9190620006d9565b6001600160a01b03811681146200059c57600080fd5b50565b600080600060608486031215620005b557600080fd5b8351620005c28162000586565b6020850151909350620005d58162000586565b604085015190925060ff81168114620005ed57600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821602908116908181146200062d576200062d620005f8565b5092915050565b6000602082840312156200064757600080fd5b5051919050565b80820180821115620006645762000664620005f8565b92915050565b6000602082840312156200067d57600080fd5b815180151581146200068e57600080fd5b9392505050565b60005b83811015620006b257818101518382015260200162000698565b50506000910152565b60008251620006cf81846020870162000695565b9190910192915050565b6020815260008251806020840152620006fa81604085016020870162000695565b601f01601f19169190910160400192915050565b614ade806200071e6000396000f3fe60806040526004361061021d5760003560e01c80638462a2b91161011d578063b5a11011116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063b5a1101114610659578063bee518a414610679578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b80639d2aede5116100ec5780639d2aede5146105b65780639fe74e26146105d6578063b0f479a1146105f6578063b187bd261461062157600080fd5b80638462a2b91461052b57806385572ffb1461054b5780638da5cb5b1461056b5780638f491cba1461059657600080fd5b806335f170ef116101b05780635e35359e1161017f5780636d62d633116101645780636d62d633146104ad5780636fef519e146104cd57806379ba50971461051657600080fd5b80635e35359e146104605780636939cd971461048057600080fd5b806335f170ef146103c45780634e12498b146103f25780635075a9d414610412578063536c6bfa1461044057600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b5061025961024436600461396b565b60096020526000908152604090205460ff1681565b6040516102669190613984565b60405180910390f35b34801561027b57600080fd5b5061028f61028a3660046139db565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba366004613a82565b6107f3565b005b3480156102cd57600080fd5b506102bf6102dc366004613aad565b610967565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613b38565b34801561034357600080fd5b506102bf610352366004613b4b565b6109c1565b34801561036357600080fd5b506102bf610a04565b34801561037857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613b4b565b610a40565b604051610266929190613b68565b3480156103fe57600080fd5b506102bf61040d366004613a82565b610b6c565b34801561041e57600080fd5b5061043261042d36600461396b565b610c38565b604051908152602001610266565b34801561044c57600080fd5b506102bf61045b366004613b96565b610c4b565b34801561046c57600080fd5b506102bf61047b366004613bc2565b610caf565b34801561048c57600080fd5b506104a061049b36600461396b565b610d44565b6040516102669190613c60565b3480156104b957600080fd5b506102bf6104c8366004613cf4565b610f4f565b3480156104d957600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561052257600080fd5b506102bf611269565b34801561053757600080fd5b506102bf610546366004613d70565b611366565b34801561055757600080fd5b506102bf610566366004613ddc565b6116c7565b34801561057757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b3480156105a257600080fd5b506102bf6105b136600461396b565b6119d4565b3480156105c257600080fd5b506102bf6105d1366004613a82565b611bb0565b3480156105e257600080fd5b506102bf6105f1366004613e17565b611c6b565b34801561060257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561062d57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561066557600080fd5b506102bf610674366004613e59565b612001565b34801561068557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b3480156106ae57600080fd5b506102bf6106bd366004613ddc565b612171565b3480156106ce57600080fd5b506102bf6106dd36600461396b565b61238e565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b610432610736366004613fbc565b6125f8565b34801561074757600080fd5b506102bf6107563660046140c9565b612b2e565b34801561076757600080fd5b506102bf610776366004613a82565b612bbf565b34801561078757600080fd5b5060085461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d790859085906140ec565b9081526040519081900360200190205460ff1690509392505050565b6107fb612bd0565b60085473ffffffffffffffffffffffffffffffffffffffff161561085c5761085c61083b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612c51565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610909576109096108c960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612e51565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61096f612bd0565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109c9612bd0565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a0c612bd0565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a3e6001612f55565b565b600360205260009081526040902080548190610a5b906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a87906140fc565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b505050505090806001018054610ae9906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b15906140fc565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905082565b610b74612bd0565b73ffffffffffffffffffffffffffffffffffffffff8116610bc1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6000610c456005836131b1565b92915050565b610c53612bd0565b610c5d82826131c4565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610cb7612bd0565b610cd873ffffffffffffffffffffffffffffffffffffffff8416838361331e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610d3791815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610db3906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddf906140fc565b8015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b50505050508152602001600382018054610e45906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e71906140fc565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f415760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610eec565b505050915250909392505050565b610f57612bd0565b6001610f646005846131b1565b14610fa3576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610fb38260025b60059190613374565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610ffb906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611027906140fc565b80156110745780601f1061104957610100808354040283529160200191611074565b820191906000526020600020905b81548152906001019060200180831161105757829003601f168201915b5050505050815260200160038201805461108d906140fc565b80601f01602080910402602001604051908101604052809291908181526020018280546110b9906140fc565b80156111065780601f106110db57610100808354040283529160200191611106565b820191906000526020600020905b8154815290600101906020018083116110e957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156111895760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611134565b5050505081525050905060005b8160800151518110156112185761121083836080015183815181106111bd576111bd61414f565b602002602001015160200151846080015184815181106111df576111df61414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661331e9092919063ffffffff16565b600101611196565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610f9a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61136e612bd0565b60005b81811015611511576003600084848481811061138f5761138f61414f565b90506020028101906113a1919061417e565b6113af906020810190613b4b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106113e6576113e661414f565b90506020028101906113f8919061417e565b6114069060208101906141bc565b6040516114149291906140ec565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061145b5761145b61414f565b905060200281019061146d919061417e565b61147b9060208101906141bc565b6040516114899291906140ec565b60405180910390208383838181106114a3576114a361414f565b90506020028101906114b5919061417e565b6114c3906020810190613b4b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb90816000604051611501911515815260200190565b60405180910390a3600101611371565b5060005b838110156116c0576001600360008787858181106115355761153561414f565b9050602002810190611547919061417e565b611555906020810190613b4b565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061158c5761158c61414f565b905060200281019061159e919061417e565b6115ac9060208101906141bc565b6040516115ba9291906140ec565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061160a5761160a61414f565b905060200281019061161c919061417e565b61162a9060208101906141bc565b6040516116389291906140ec565b60405180910390208585838181106116525761165261414f565b9050602002810190611664919061417e565b611672906020810190613b4b565b67ffffffffffffffff167f8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb908160016040516116b0911515815260200190565b60405180910390a3600101611515565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461171a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610f9a565b61172a6040820160208301613b4b565b61173760408301836141bc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061178e925090506140fc565b159050806117e45750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117cf9190614221565b9081526040519081900360200190205460ff16155b1561181d57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b38565b61182d6040840160208501613b4b565b67ffffffffffffffff8116600090815260036020526040902080548190611853906140fc565b905060000361189a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906118d6908890600401614335565b600060405180830381600087803b1580156118f057600080fd5b505af1925050508015611901575060015b6119a1573d80801561192f576040519150601f19603f3d011682016040523d82523d6000602084013e611934565b606091505b5061194186356001610faa565b5085356000908152600460205260409020869061195e8282614707565b50506040518635907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611993908490613b38565b60405180910390a2506116c0565b6040518535907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff161580611a2c5750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b15611a345750565b600a54600190611a68907d010000000000000000000000000000000000000000000000000000000000900460ff1683614801565b11611bad5760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b24919061483c565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611bb8612bd0565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff16600090815260036020522090611c679082614859565b5050565b611c73612bd0565b60005b81811015611ffc57828282818110611c9057611c9061414f565b9050602002810190611ca29190614973565b611cb3906040810190602001613aad565b611d7f5760036000848484818110611ccd57611ccd61414f565b9050602002810190611cdf9190614973565b611ced906020810190613b4b565b67ffffffffffffffff16815260208101919091526040016000908120611d129161391d565b828282818110611d2457611d2461414f565b9050602002810190611d369190614973565b611d44906020810190613b4b565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611ff4565b828282818110611d9157611d9161414f565b9050602002810190611da39190614973565b611db19060408101906141bc565b9050600003611dec576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611e0457611e0461414f565b9050602002810190611e169190614973565b611e24906020810190613b4b565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611e5a57611e5a61414f565b9050602002810190611e6c9190614973565b611e7a9060408101906141bc565b8291611e8791908361448b565b50838383818110611e9a57611e9a61414f565b9050602002810190611eac9190614973565b611eba9060608101906141bc565b159050611f0557838383818110611ed357611ed361414f565b9050602002810190611ee59190614973565b611ef39060608101906141bc565b6001830191611f0391908361448b565b505b838383818110611f1757611f1761414f565b9050602002810190611f299190614973565b611f379060408101906141bc565b604051611f459291906140ec565b6040518091039020848484818110611f5f57611f5f61414f565b9050602002810190611f719190614973565b611f7f906020810190613b4b565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611fbc57611fbc61414f565b9050602002810190611fce9190614973565b611fdc9060608101906141bc565b604051611fea9291906149a7565b60405180910390a3505b600101611c76565b505050565b612009612bd0565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526120c491614221565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611ffc9082614859565b3330146121aa576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ba6040820160208301613b4b565b6121c760408301836141bc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061221e925090506140fc565b159050806122745750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161225f9190614221565b9081526040519081900360200190205460ff16155b156122ad57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b38565b6122bd6040840160208501613b4b565b67ffffffffffffffff81166000908152600360205260409020805481906122e3906140fc565b905060000361232a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b600061233960608701876141bc565b810190612346919061396b565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff16612386576123866123818260016149bb565b612f55565b505050505050565b600161239b6005836131b1565b146123d5576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610f9a565b6123e0816000610faa565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191612428906140fc565b80601f0160208091040260200160405190810160405280929190818152602001828054612454906140fc565b80156124a15780601f10612476576101008083540402835291602001916124a1565b820191906000526020600020905b81548152906001019060200180831161248457829003601f168201915b505050505081526020016003820180546124ba906140fc565b80601f01602080910402602001604051908101604052809291908181526020018280546124e6906140fc565b80156125335780601f1061250857610100808354040283529160200191612533565b820191906000526020600020905b81548152906001019060200180831161251657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156125b65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612561565b505050508152505090506125c981613389565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190612621906140fc565b9050600003612668576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f9a565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190612698906140fc565b80601f01602080910402602001604051908101604052809291908181526020018280546126c4906140fc565b80156127115780601f106126e657610100808354040283529160200191612711565b820191906000526020600020905b8154815290600101906020018083116126f457829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191612772906140fc565b80601f016020809104026020016040519081016040528092919081815260200182805461279e906140fc565b80156127eb5780601f106127c0576101008083540402835291602001916127eb565b820191906000526020600020905b8154815290600101906020018083116127ce57829003601f168201915b5050505050815250905060005b86518110156129485761286833308984815181106128185761281861414f565b6020026020010151602001518a85815181106128365761283661414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16613391909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106128985761289861414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146129405760025487516129409173ffffffffffffffffffffffffffffffffffffffff16908990849081106128f1576128f161414f565b60200260200101516020015189848151811061290f5761290f61414f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c519092919063ffffffff16565b6001016127f8565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906129a2908b9086906004016149ce565b602060405180830381865afa1580156129bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e39190614a9b565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612a2957600854612a299073ffffffffffffffffffffffffffffffffffffffff16333084613391565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612a5b576000612a5d565b825b8a856040518463ffffffff1660e01b8152600401612a7c9291906149ce565b60206040518083038185885af1158015612a9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612abf9190614a9b565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612b36612bd0565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612bc7612bd0565b611bad816133ef565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f9a565b801580612cf157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cef9190614a9b565b155b612d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ffc9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526134e4565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eec9190614a9b565b612ef691906149bb565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612f4f9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612dcf565b50505050565b80600116600103612f98576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612fcc565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612fd5816119d4565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161303991815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156130b357816020015b604080518082019091526000808252602082015281526020019060019003908161308c5790505b50815260085473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061310a60025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f99161316e9167ffffffffffffffff9091169085906004016149ce565b6020604051808303816000875af115801561318d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc9190614a9b565b60006131bd83836135f0565b9392505050565b8047101561322e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f9a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613288576040519150601f19603f3d011682016040523d82523d6000602084013e61328d565b606091505b5050905080611ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f9a565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ffc9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612dcf565b600061338184848461367a565b949350505050565b611bad612bd0565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f4f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612dcf565b3373ffffffffffffffffffffffffffffffffffffffff82160361346e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f9a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613546826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136979092919063ffffffff16565b805190915015611ffc57808060200190518101906135649190614ab4565b611ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9a565b600081815260028301602052604081205480151580613614575061361484846136a6565b6131bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610f9a565b6000828152600284016020526040812082905561338184846136b2565b606061338184846000856136be565b60006131bd83836137d7565b60006131bd83836137ef565b606082471015613750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137799190614221565b60006040518083038185875af1925050503d80600081146137b6576040519150601f19603f3d011682016040523d82523d6000602084013e6137bb565b606091505b50915091506137cc8783838761383e565b979650505050505050565b600081815260018301602052604081205415156131bd565b600081815260018301602052604081205461383657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c45565b506000610c45565b606083156138d45782516000036138cd5773ffffffffffffffffffffffffffffffffffffffff85163b6138cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9a565b5081613381565b61338183838151156138e95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a9190613b38565b508054613929906140fc565b6000825580601f10613939575050565b601f016020900490600052602060002090810190611bad91905b808211156139675760008155600101613953565b5090565b60006020828403121561397d57600080fd5b5035919050565b60208101600383106139bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611bad57600080fd5b6000806000604084860312156139f057600080fd5b83356139fb816139c5565b9250602084013567ffffffffffffffff80821115613a1857600080fd5b818601915086601f830112613a2c57600080fd5b813581811115613a3b57600080fd5b876020828501011115613a4d57600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff81168114611bad57600080fd5b600060208284031215613a9457600080fd5b81356131bd81613a60565b8015158114611bad57600080fd5b600060208284031215613abf57600080fd5b81356131bd81613a9f565b60005b83811015613ae5578181015183820152602001613acd565b50506000910152565b60008151808452613b06816020860160208601613aca565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131bd6020830184613aee565b600060208284031215613b5d57600080fd5b81356131bd816139c5565b604081526000613b7b6040830185613aee565b8281036020840152613b8d8185613aee565b95945050505050565b60008060408385031215613ba957600080fd5b8235613bb481613a60565b946020939093013593505050565b600080600060608486031215613bd757600080fd5b8335613be281613a60565b92506020840135613bf281613a60565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613c55578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613c18565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613c9a60c0840182613aee565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613cd68383613aee565b925060808601519150808584030160a086015250613b8d8282613c03565b60008060408385031215613d0757600080fd5b823591506020830135613d1981613a60565b809150509250929050565b60008083601f840112613d3657600080fd5b50813567ffffffffffffffff811115613d4e57600080fd5b6020830191508360208260051b8501011115613d6957600080fd5b9250929050565b60008060008060408587031215613d8657600080fd5b843567ffffffffffffffff80821115613d9e57600080fd5b613daa88838901613d24565b90965094506020870135915080821115613dc357600080fd5b50613dd087828801613d24565b95989497509550505050565b600060208284031215613dee57600080fd5b813567ffffffffffffffff811115613e0557600080fd5b820160a081850312156131bd57600080fd5b60008060208385031215613e2a57600080fd5b823567ffffffffffffffff811115613e4157600080fd5b613e4d85828601613d24565b90969095509350505050565b60008060408385031215613e6c57600080fd5b8235613e77816139c5565b91506020830135613d1981613a60565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613ed957613ed9613e87565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613f2657613f26613e87565b604052919050565b600082601f830112613f3f57600080fd5b813567ffffffffffffffff811115613f5957613f59613e87565b613f8a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613edf565b818152846020838601011115613f9f57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613fd157600080fd5b8335613fdc816139c5565b925060208481013567ffffffffffffffff80821115613ffa57600080fd5b818701915087601f83011261400e57600080fd5b81358181111561402057614020613e87565b61402e848260051b01613edf565b81815260069190911b8301840190848101908a83111561404d57600080fd5b938501935b82851015614099576040858c03121561406b5760008081fd5b614073613eb6565b853561407e81613a60565b81528587013587820152825260409094019390850190614052565b9650505060408701359250808311156140b157600080fd5b50506140bf86828701613f2e565b9150509250925092565b6000602082840312156140db57600080fd5b813560ff811681146131bd57600080fd5b8183823760009101908152919050565b600181811c9082168061411057607f821691505b602082108103614149577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126141b257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126141f157600080fd5b83018035915067ffffffffffffffff82111561420c57600080fd5b602001915036819003821315613d6957600080fd5b600082516141b2818460208701613aca565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261426857600080fd5b830160208101925035905067ffffffffffffffff81111561428857600080fd5b803603821315613d6957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613c5557813561430381613a60565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016142f0565b602081528135602082015260006020830135614350816139c5565b67ffffffffffffffff808216604085015261436e6040860186614233565b925060a0606086015261438560c086018483614297565b9250506143956060860186614233565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526143cb858385614297565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261440457600080fd5b6020928801928301923591508382111561441d57600080fd5b8160061b360383131561442f57600080fd5b8685030160a08701526137cc8482846142e0565b601f821115611ffc576000816000526020600020601f850160051c8101602086101561446c5750805b601f850160051c820191505b8181101561238657828155600101614478565b67ffffffffffffffff8311156144a3576144a3613e87565b6144b7836144b183546140fc565b83614443565b6000601f84116001811461450957600085156144d35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556116c0565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156145585786850135825560209485019460019092019101614538565b5086821015614593577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356145df81613a60565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561464557614645613e87565b8054838255808410156146d25760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314614686576146866145a5565b8086168614614697576146976145a5565b5060008360005260206000208360011b81018760011b820191505b808210156146cd5782825582848301556002820191506146b2565b505050505b5060008181526020812083915b85811015612386576146f183836145d4565b60409290920191600291909101906001016146df565b8135815560018101602083013561471d816139c5565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561475d60408601866141bc565b9350915061476f83836002870161448b565b61477c60608601866141bc565b9350915061478e83836003870161448b565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126147c557600080fd5b9184019182359150808211156147da57600080fd5b506020820191508060061b36038213156147f357600080fd5b612f4f81836004860161462c565b600082614837577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561484e57600080fd5b81516131bd81613a60565b815167ffffffffffffffff81111561487357614873613e87565b6148878161488184546140fc565b84614443565b602080601f8311600181146148da57600084156148a45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612386565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561492757888601518255948401946001909101908401614908565b508582101561496357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141b257600080fd5b602081526000613381602083018486614297565b80820180821115610c4557610c456145a5565b67ffffffffffffffff83168152604060208201526000825160a060408401526149fa60e0840182613aee565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614a368383613aee565b92506040860151915080858403016080860152614a538383613c03565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250614a918282613aee565b9695505050505050565b600060208284031215614aad57600080fd5b5051919050565b600060208284031215614ac657600080fd5b81516131bd81613a9f56fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620051393803806200513983398101604081905262000034916200059b565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000177565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b0382168360001962000222565b5050505050508060026200015491906200060a565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070a565b336001600160a01b03821603620001d15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029a919062000630565b620002a691906200064a565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000302918691906200030816565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000357906001600160a01b038516908490620003de565b805190915015620003d9578080602001905181019062000378919062000666565b620003d95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003ef8484600085620003f7565b949350505050565b6060824710156200045a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004789190620006b7565b60006040518083038185875af1925050503d8060008114620004b7576040519150601f19603f3d011682016040523d82523d6000602084013e620004bc565b606091505b509092509050620004d087838387620004db565b979650505050505050565b606083156200054f57825160000362000547576001600160a01b0385163b620005475760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003ef565b620003ef8383815115620005665781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006d5565b6001600160a01b03811681146200059857600080fd5b50565b600080600060608486031215620005b157600080fd5b8351620005be8162000582565b6020850151909350620005d18162000582565b604085015190925060ff81168114620005e957600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff8181168382160290811690818114620006295762000629620005f4565b5092915050565b6000602082840312156200064357600080fd5b5051919050565b80820180821115620006605762000660620005f4565b92915050565b6000602082840312156200067957600080fd5b815180151581146200068a57600080fd5b9392505050565b60005b83811015620006ae57818101518382015260200162000694565b50506000910152565b60008251620006cb81846020870162000691565b9190910192915050565b6020815260008251806020840152620006f681604085016020870162000691565b601f01601f19169190910160400192915050565b614a1f806200071a6000396000f3fe60806040526004361061021d5760003560e01c806385572ffb1161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063bee518a414610659578063c851cc3214610682578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b80639fe74e26116100ec5780639fe74e26146105b6578063b0f479a1146105d6578063b187bd2614610601578063b5a110111461063957600080fd5b806385572ffb1461052b5780638da5cb5b1461054b5780638f491cba146105765780639d2aede51461059657600080fd5b806335f170ef116101b05780636939cd971161017f5780636fef519e116101645780636fef519e146104ad57806379ba5097146104f65780638462a2b91461050b57600080fd5b80636939cd97146104605780636d62d6331461048d57600080fd5b806335f170ef146103c45780635075a9d4146103f2578063536c6bfa146104205780635e35359e1461044057600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b506102596102443660046138ac565b60096020526000908152604090205460ff1681565b60405161026691906138c5565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461391c565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba3660046139c3565b6107f3565b005b3480156102cd57600080fd5b506102bf6102dc3660046139ee565b610967565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613a79565b34801561034357600080fd5b506102bf610352366004613a8c565b6109c1565b34801561036357600080fd5b506102bf610a04565b34801561037857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613a8c565b610a40565b604051610266929190613aa9565b3480156103fe57600080fd5b5061041261040d3660046138ac565b610b6c565b604051908152602001610266565b34801561042c57600080fd5b506102bf61043b366004613ad7565b610b7f565b34801561044c57600080fd5b506102bf61045b366004613b03565b610be3565b34801561046c57600080fd5b5061048061047b3660046138ac565b610c78565b6040516102669190613ba1565b34801561049957600080fd5b506102bf6104a8366004613c35565b610e83565b3480156104b957600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561050257600080fd5b506102bf61119d565b34801561051757600080fd5b506102bf610526366004613cb1565b61129a565b34801561053757600080fd5b506102bf610546366004613d1d565b6115db565b34801561055757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561058257600080fd5b506102bf6105913660046138ac565b6117e4565b3480156105a257600080fd5b506102bf6105b13660046139c3565b6119c0565b3480156105c257600080fd5b506102bf6105d1366004613d58565b611a7b565b3480156105e257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561060d57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064557600080fd5b506102bf610654366004613d9a565b611e0c565b34801561066557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b34801561068e57600080fd5b506102bf61069d3660046139c3565b611f7c565b3480156106ae57600080fd5b506102bf6106bd366004613d1d565b612048565b3480156106ce57600080fd5b506102bf6106dd3660046138ac565b612265565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b610412610736366004613efd565b6124cf565b34801561074757600080fd5b506102bf61075636600461400a565b612a05565b34801561076757600080fd5b506102bf6107763660046139c3565b612a96565b34801561078757600080fd5b5060085461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d7908590859061402d565b9081526040519081900360200190205460ff1690509392505050565b6107fb612aa7565b60085473ffffffffffffffffffffffffffffffffffffffff161561085c5761085c61083b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b28565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610909576109096108c960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612d28565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61096f612aa7565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109c9612aa7565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a0c612aa7565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a3e6001612e2c565b565b600360205260009081526040902080548190610a5b9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a879061403d565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b505050505090806001018054610ae99061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b159061403d565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905082565b6000610b79600583613088565b92915050565b610b87612aa7565b610b91828261309b565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610beb612aa7565b610c0c73ffffffffffffffffffffffffffffffffffffffff841683836131f5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610c6b91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ce79061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d139061403d565b8015610d605780601f10610d3557610100808354040283529160200191610d60565b820191906000526020600020905b815481529060010190602001808311610d4357829003601f168201915b50505050508152602001600382018054610d799061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610da59061403d565b8015610df25780601f10610dc757610100808354040283529160200191610df2565b820191906000526020600020905b815481529060010190602001808311610dd557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e755760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e20565b505050915250909392505050565b610e8b612aa7565b6001610e98600584613088565b14610ed7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ee78260025b6005919061324b565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f2f9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5b9061403d565b8015610fa85780601f10610f7d57610100808354040283529160200191610fa8565b820191906000526020600020905b815481529060010190602001808311610f8b57829003601f168201915b50505050508152602001600382018054610fc19061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fed9061403d565b801561103a5780601f1061100f5761010080835404028352916020019161103a565b820191906000526020600020905b81548152906001019060200180831161101d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611068565b5050505081525050905060005b81608001515181101561114c5761114483836080015183815181106110f1576110f1614090565b6020026020010151602001518460800151848151811061111357611113614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166131f59092919063ffffffff16565b6001016110ca565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ece565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112a2612aa7565b60005b8181101561143557600360008484848181106112c3576112c3614090565b90506020028101906112d591906140bf565b6112e3906020810190613a8c565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061131a5761131a614090565b905060200281019061132c91906140bf565b61133a9060208101906140fd565b60405161134892919061402d565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061138f5761138f614090565b90506020028101906113a191906140bf565b6113af9060208101906140fd565b6040516113bd92919061402d565b60405180910390208383838181106113d7576113d7614090565b90506020028101906113e991906140bf565b6113f7906020810190613a8c565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016112a5565b5060005b838110156115d45760016003600087878581811061145957611459614090565b905060200281019061146b91906140bf565b611479906020810190613a8c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106114b0576114b0614090565b90506020028101906114c291906140bf565b6114d09060208101906140fd565b6040516114de92919061402d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061152e5761152e614090565b905060200281019061154091906140bf565b61154e9060208101906140fd565b60405161155c92919061402d565b604051809103902085858381811061157657611576614090565b905060200281019061158891906140bf565b611596906020810190613a8c565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611439565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461162e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ece565b61163e6040820160208301613a8c565b67ffffffffffffffff81166000908152600360205260409020805481906116649061403d565b90506000036116ab576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ece565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906116e7908690600401614264565b600060405180830381600087803b15801561170157600080fd5b505af1925050508015611712575060015b6117b2573d808015611740576040519150601f19603f3d011682016040523d82523d6000602084013e611745565b606091505b5061175284356001610ede565b5083356000908152600460205260409020849061176f8282614636565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906117a4908490613a79565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff16158061183c5750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156118445750565b600a54600190611878907d010000000000000000000000000000000000000000000000000000000000900460ff1683614730565b116119bd5760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611910573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611934919061476b565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561197b57600080fd5b505af115801561198f573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6119c8612aa7565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff16600090815260036020522090611a779082614788565b5050565b611a83612aa7565b60005b818110156117df57828282818110611aa057611aa0614090565b9050602002810190611ab291906148a2565b611ac39060408101906020016139ee565b611b8f5760036000848484818110611add57611add614090565b9050602002810190611aef91906148a2565b611afd906020810190613a8c565b67ffffffffffffffff16815260208101919091526040016000908120611b229161385e565b828282818110611b3457611b34614090565b9050602002810190611b4691906148a2565b611b54906020810190613a8c565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611e04565b828282818110611ba157611ba1614090565b9050602002810190611bb391906148a2565b611bc19060408101906140fd565b9050600003611bfc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611c1457611c14614090565b9050602002810190611c2691906148a2565b611c34906020810190613a8c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611c6a57611c6a614090565b9050602002810190611c7c91906148a2565b611c8a9060408101906140fd565b8291611c979190836143ba565b50838383818110611caa57611caa614090565b9050602002810190611cbc91906148a2565b611cca9060608101906140fd565b159050611d1557838383818110611ce357611ce3614090565b9050602002810190611cf591906148a2565b611d039060608101906140fd565b6001830191611d139190836143ba565b505b838383818110611d2757611d27614090565b9050602002810190611d3991906148a2565b611d479060408101906140fd565b604051611d5592919061402d565b6040518091039020848484818110611d6f57611d6f614090565b9050602002810190611d8191906148a2565b611d8f906020810190613a8c565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611dcc57611dcc614090565b9050602002810190611dde91906148a2565b611dec9060608101906140fd565b604051611dfa9291906148d6565b60405180910390a3505b600101611a86565b611e14612aa7565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611ecf916148ea565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906117df9082614788565b611f84612aa7565b73ffffffffffffffffffffffffffffffffffffffff8116611fd1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b333014612081576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120916040820160208301613a8c565b61209e60408301836140fd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506120f59250905061403d565b1590508061214b5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161213691906148ea565b9081526040519081900360200190205460ff16155b1561218457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ece9190613a79565b6121946040840160208501613a8c565b67ffffffffffffffff81166000908152600360205260409020805481906121ba9061403d565b9050600003612201576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ece565b600061221060608701876140fd565b81019061221d91906138ac565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff1661225d5761225d6122588260016148fc565b612e2c565b505050505050565b6001612272600583613088565b146122ac576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ece565b6122b7816000610ede565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916122ff9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461232b9061403d565b80156123785780601f1061234d57610100808354040283529160200191612378565b820191906000526020600020905b81548152906001019060200180831161235b57829003601f168201915b505050505081526020016003820180546123919061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd9061403d565b801561240a5780601f106123df5761010080835404028352916020019161240a565b820191906000526020600020905b8154815290600101906020018083116123ed57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561248d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612438565b505050508152505090506124a081613260565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906124f89061403d565b905060000361253f576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ece565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061256f9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461259b9061403d565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916126499061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546126759061403d565b80156126c25780601f10612697576101008083540402835291602001916126c2565b820191906000526020600020905b8154815290600101906020018083116126a557829003601f168201915b5050505050815250905060005b865181101561281f5761273f33308984815181106126ef576126ef614090565b6020026020010151602001518a858151811061270d5761270d614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132d2909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061276f5761276f614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146128175760025487516128179173ffffffffffffffffffffffffffffffffffffffff16908990849081106127c8576127c8614090565b6020026020010151602001518984815181106127e6576127e6614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b289092919063ffffffff16565b6001016126cf565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612879908b90869060040161490f565b602060405180830381865afa158015612896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ba91906149dc565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612900576008546129009073ffffffffffffffffffffffffffffffffffffffff163330846132d2565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612932576000612934565b825b8a856040518463ffffffff1660e01b815260040161295392919061490f565b60206040518083038185885af1158015612971573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061299691906149dc565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612a0d612aa7565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a9e612aa7565b6119bd81613330565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ece565b801580612bc857506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc691906149dc565b155b612c54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ece565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117df9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613425565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc391906149dc565b612dcd91906148fc565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612e269085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612ca6565b50505050565b80600116600103612e6f576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612ea3565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612eac816117e4565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612f1091815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612f8a57816020015b6040805180820190915260008082526020820152815260200190600190039081612f635790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612fe160025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f9916130459167ffffffffffffffff90911690859060040161490f565b6020604051808303816000875af1158015613064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df91906149dc565b60006130948383613531565b9392505050565b80471015613105576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ece565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461315f576040519150601f19603f3d011682016040523d82523d6000602084013e613164565b606091505b50509050806117df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ece565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117df9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612ca6565b60006132588484846135bb565b949350505050565b613268612aa7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906132a4908490600401613ba1565b600060405180830381600087803b1580156132be57600080fd5b505af11580156115d4573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e269085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ca6565b3373ffffffffffffffffffffffffffffffffffffffff8216036133af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ece565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613487826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135d89092919063ffffffff16565b8051909150156117df57808060200190518101906134a591906149f5565b6117df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ece565b600081815260028301602052604081205480151580613555575061355584846135e7565b613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ece565b6000828152600284016020526040812082905561325884846135f3565b606061325884846000856135ff565b60006130948383613718565b60006130948383613730565b606082471015613691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ece565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136ba91906148ea565b60006040518083038185875af1925050503d80600081146136f7576040519150601f19603f3d011682016040523d82523d6000602084013e6136fc565b606091505b509150915061370d8783838761377f565b979650505050505050565b60008181526001830160205260408120541515613094565b600081815260018301602052604081205461377757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b79565b506000610b79565b6060831561381557825160000361380e5773ffffffffffffffffffffffffffffffffffffffff85163b61380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ece565b5081613258565b613258838381511561382a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece9190613a79565b50805461386a9061403d565b6000825580601f1061387a575050565b601f0160209004906000526020600020908101906119bd91905b808211156138a85760008155600101613894565b5090565b6000602082840312156138be57600080fd5b5035919050565b6020810160038310613900577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146119bd57600080fd5b60008060006040848603121561393157600080fd5b833561393c81613906565b9250602084013567ffffffffffffffff8082111561395957600080fd5b818601915086601f83011261396d57600080fd5b81358181111561397c57600080fd5b87602082850101111561398e57600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b6000602082840312156139d557600080fd5b8135613094816139a1565b80151581146119bd57600080fd5b600060208284031215613a0057600080fd5b8135613094816139e0565b60005b83811015613a26578181015183820152602001613a0e565b50506000910152565b60008151808452613a47816020860160208601613a0b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006130946020830184613a2f565b600060208284031215613a9e57600080fd5b813561309481613906565b604081526000613abc6040830185613a2f565b8281036020840152613ace8185613a2f565b95945050505050565b60008060408385031215613aea57600080fd5b8235613af5816139a1565b946020939093013593505050565b600080600060608486031215613b1857600080fd5b8335613b23816139a1565b92506020840135613b33816139a1565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b96578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613b59565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613bdb60c0840182613a2f565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613c178383613a2f565b925060808601519150808584030160a086015250613ace8282613b44565b60008060408385031215613c4857600080fd5b823591506020830135613c5a816139a1565b809150509250929050565b60008083601f840112613c7757600080fd5b50813567ffffffffffffffff811115613c8f57600080fd5b6020830191508360208260051b8501011115613caa57600080fd5b9250929050565b60008060008060408587031215613cc757600080fd5b843567ffffffffffffffff80821115613cdf57600080fd5b613ceb88838901613c65565b90965094506020870135915080821115613d0457600080fd5b50613d1187828801613c65565b95989497509550505050565b600060208284031215613d2f57600080fd5b813567ffffffffffffffff811115613d4657600080fd5b820160a0818503121561309457600080fd5b60008060208385031215613d6b57600080fd5b823567ffffffffffffffff811115613d8257600080fd5b613d8e85828601613c65565b90969095509350505050565b60008060408385031215613dad57600080fd5b8235613db881613906565b91506020830135613c5a816139a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613e1a57613e1a613dc8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e6757613e67613dc8565b604052919050565b600082601f830112613e8057600080fd5b813567ffffffffffffffff811115613e9a57613e9a613dc8565b613ecb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613e20565b818152846020838601011115613ee057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613f1257600080fd5b8335613f1d81613906565b925060208481013567ffffffffffffffff80821115613f3b57600080fd5b818701915087601f830112613f4f57600080fd5b813581811115613f6157613f61613dc8565b613f6f848260051b01613e20565b81815260069190911b8301840190848101908a831115613f8e57600080fd5b938501935b82851015613fda576040858c031215613fac5760008081fd5b613fb4613df7565b8535613fbf816139a1565b81528587013587820152825260409094019390850190613f93565b965050506040870135925080831115613ff257600080fd5b505061400086828701613e6f565b9150509250925092565b60006020828403121561401c57600080fd5b813560ff8116811461309457600080fd5b8183823760009101908152919050565b600181811c9082168061405157607f821691505b60208210810361408a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126140f357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261413257600080fd5b83018035915067ffffffffffffffff82111561414d57600080fd5b602001915036819003821315613caa57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261419757600080fd5b830160208101925035905067ffffffffffffffff8111156141b757600080fd5b803603821315613caa57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b96578135614232816139a1565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161421f565b60208152813560208201526000602083013561427f81613906565b67ffffffffffffffff808216604085015261429d6040860186614162565b925060a060608601526142b460c0860184836141c6565b9250506142c46060860186614162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526142fa8583856141c6565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261433357600080fd5b6020928801928301923591508382111561434c57600080fd5b8160061b360383131561435e57600080fd5b8685030160a087015261370d84828461420f565b601f8211156117df576000816000526020600020601f850160051c8101602086101561439b5750805b601f850160051c820191505b8181101561225d578281556001016143a7565b67ffffffffffffffff8311156143d2576143d2613dc8565b6143e6836143e0835461403d565b83614372565b6000601f84116001811461443857600085156144025750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115d4565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156144875786850135825560209485019460019092019101614467565b50868210156144c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561450e816139a1565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561457457614574613dc8565b8054838255808410156146015760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146145b5576145b56144d4565b80861686146145c6576145c66144d4565b5060008360005260206000208360011b81018760011b820191505b808210156145fc5782825582848301556002820191506145e1565b505050505b5060008181526020812083915b8581101561225d576146208383614503565b604092909201916002919091019060010161460e565b8135815560018101602083013561464c81613906565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561468c60408601866140fd565b9350915061469e8383600287016143ba565b6146ab60608601866140fd565b935091506146bd8383600387016143ba565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126146f457600080fd5b91840191823591508082111561470957600080fd5b506020820191508060061b360382131561472257600080fd5b612e2681836004860161455b565b600082614766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561477d57600080fd5b8151613094816139a1565b815167ffffffffffffffff8111156147a2576147a2613dc8565b6147b6816147b0845461403d565b84614372565b602080601f83116001811461480957600084156147d35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561225d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561485657888601518255948401946001909101908401614837565b508582101561489257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126140f357600080fd5b6020815260006132586020830184866141c6565b600082516140f3818460208701613a0b565b80820180821115610b7957610b796144d4565b67ffffffffffffffff83168152604060208201526000825160a0604084015261493b60e0840182613a2f565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526149778383613a2f565b925060408601519150808584030160808601526149948383613b44565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149d28282613a2f565b9695505050505050565b6000602082840312156149ee57600080fd5b5051919050565b600060208284031215614a0757600080fd5b8151613094816139e056fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -596,18 +596,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ModifyFeeToken(t return _SelfFundedPingPong.Contract.ModifyFeeToken(&_SelfFundedPingPong.TransactOpts, token) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "modifyRouter", newRouter) -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.ModifyRouter(&_SelfFundedPingPong.TransactOpts, newRouter) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) ModifyRouter(newRouter common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.ModifyRouter(&_SelfFundedPingPong.TransactOpts, newRouter) -} - func (_SelfFundedPingPong *SelfFundedPingPongTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "processMessage", message) } @@ -728,6 +716,18 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSe return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) } +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateRouter(&_SelfFundedPingPong.TransactOpts, newRouter) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateRouter(&_SelfFundedPingPong.TransactOpts, newRouter) +} + func (_SelfFundedPingPong *SelfFundedPingPongTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "withdrawNativeToken", to, amount) } @@ -764,8 +764,144 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) Receive() (*type return _SelfFundedPingPong.Contract.Receive(&_SelfFundedPingPong.TransactOpts) } -type SelfFundedPingPongApprovedSenderModifiedIterator struct { - Event *SelfFundedPingPongApprovedSenderModified +type SelfFundedPingPongApprovedSenderAddedIterator struct { + Event *SelfFundedPingPongApprovedSenderAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongApprovedSenderAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongApprovedSenderAdded) + 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(SelfFundedPingPongApprovedSenderAdded) + 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 *SelfFundedPingPongApprovedSenderAddedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongApprovedSenderAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongApprovedSenderAdded struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderAddedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongApprovedSenderAddedIterator{contract: _SelfFundedPingPong.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongApprovedSenderAdded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderAdded", 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) ParseApprovedSenderAdded(log types.Log) (*SelfFundedPingPongApprovedSenderAdded, error) { + event := new(SelfFundedPingPongApprovedSenderAdded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongApprovedSenderRemovedIterator struct { + Event *SelfFundedPingPongApprovedSenderRemoved contract *bind.BoundContract event string @@ -776,7 +912,7 @@ type SelfFundedPingPongApprovedSenderModifiedIterator struct { fail error } -func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Next() bool { +func (it *SelfFundedPingPongApprovedSenderRemovedIterator) Next() bool { if it.fail != nil { return false @@ -785,7 +921,7 @@ func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongApprovedSenderModified) + it.Event = new(SelfFundedPingPongApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -800,7 +936,7 @@ func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongApprovedSenderModified) + it.Event = new(SelfFundedPingPongApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -815,23 +951,22 @@ func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Next() bool { } } -func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Error() error { +func (it *SelfFundedPingPongApprovedSenderRemovedIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongApprovedSenderModifiedIterator) Close() error { +func (it *SelfFundedPingPongApprovedSenderRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongApprovedSenderModified struct { +type SelfFundedPingPongApprovedSenderRemoved struct { DestChainSelector uint64 Recipient common.Hash - IsBeingApproved bool Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderModifiedIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderRemovedIterator, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -842,14 +977,14 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterApprovedSenderModif recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &SelfFundedPingPongApprovedSenderModifiedIterator{contract: _SelfFundedPingPong.contract, event: "ApprovedSenderModified", logs: logs, sub: sub}, nil + return &SelfFundedPingPongApprovedSenderRemovedIterator{contract: _SelfFundedPingPong.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { var destChainSelectorRule []interface{} for _, destChainSelectorItem := range destChainSelector { @@ -860,7 +995,7 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderModifi recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ApprovedSenderModified", destChainSelectorRule, recipientRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -870,8 +1005,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderModifi select { case log := <-logs: - event := new(SelfFundedPingPongApprovedSenderModified) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { + event := new(SelfFundedPingPongApprovedSenderRemoved) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return err } event.Raw = log @@ -892,9 +1027,9 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchApprovedSenderModifi }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseApprovedSenderModified(log types.Log) (*SelfFundedPingPongApprovedSenderModified, error) { - event := new(SelfFundedPingPongApprovedSenderModified) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderModified", log); err != nil { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseApprovedSenderRemoved(log types.Log) (*SelfFundedPingPongApprovedSenderRemoved, error) { + event := new(SelfFundedPingPongApprovedSenderRemoved) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log @@ -1859,8 +1994,8 @@ func (it *SelfFundedPingPongMessageAckReceivedIterator) Close() error { } type SelfFundedPingPongMessageAckReceived struct { - Arg0 [32]byte - Raw types.Log + MessageId [32]byte + Raw types.Log } func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*SelfFundedPingPongMessageAckReceivedIterator, error) { @@ -3200,8 +3335,10 @@ type SChainConfigs struct { func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { - case _SelfFundedPingPong.abi.Events["ApprovedSenderModified"].ID: - return _SelfFundedPingPong.ParseApprovedSenderModified(log) + case _SelfFundedPingPong.abi.Events["ApprovedSenderAdded"].ID: + return _SelfFundedPingPong.ParseApprovedSenderAdded(log) + case _SelfFundedPingPong.abi.Events["ApprovedSenderRemoved"].ID: + return _SelfFundedPingPong.ParseApprovedSenderRemoved(log) case _SelfFundedPingPong.abi.Events["CCIPRouterModified"].ID: return _SelfFundedPingPong.ParseCCIPRouterModified(log) case _SelfFundedPingPong.abi.Events["ChainAdded"].ID: @@ -3244,8 +3381,12 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate } } -func (SelfFundedPingPongApprovedSenderModified) Topic() common.Hash { - return common.HexToHash("0x8b7bd63124894be95396727f5b0df205ee011641e77fdab67e084f997ceb9081") +func (SelfFundedPingPongApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (SelfFundedPingPongApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") } func (SelfFundedPingPongCCIPRouterModified) Topic() common.Hash { @@ -3369,8 +3510,6 @@ type SelfFundedPingPongInterface interface { ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - ModifyRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) - ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) @@ -3391,17 +3530,25 @@ type SelfFundedPingPongInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) - FilterApprovedSenderModified(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderModifiedIterator, error) + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*SelfFundedPingPongApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*SelfFundedPingPongApprovedSenderRemovedIterator, error) - WatchApprovedSenderModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderModified, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) - ParseApprovedSenderModified(log types.Log) (*SelfFundedPingPongApprovedSenderModified, error) + ParseApprovedSenderRemoved(log types.Log) (*SelfFundedPingPongApprovedSenderRemoved, error) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*SelfFundedPingPongCCIPRouterModifiedIterator, 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 5968c1a244..eb9d001395 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 0d3e5064f9ad28a28778279bcf9e392219f93132d6a04a6a7911d1245a39420d -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 1c75330f4f6cc75d7f0decf7ba84fce351ab8dc686199372d06ef2bc9bdc45e2 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e8e2eedb90cfaee9b2f6ed2130d882d139d45c6c736557efd8772923e5e9ab86 -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin fe42de7249e2984e7d59e8257db806f700679015e9343119f6ddc0bc8200c9ec +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin f03e364b78e6af4a4be1f0e4b023a43c0a6786572a8c8c1fe0a3449dce968ab5 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0d7d496ff6aaf37fcf8db25c708b6977c841650027a2028c864f7a0e17fa7b08 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 3f3cd6cb13008bae846d8778aab17c57d213e45da85ba8dd6d42937e8b7f3120 +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin e142b529faf36c9dbc55be72947493f235e1d6ac2d76658a2273ac8e53ac4f5e ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c44460757ca0e1b228734b32b9ab03221b93d77bb9f8e2970830779a8be2cb78 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 @@ -28,11 +28,11 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin cdc11c1ab4c1c3fd77f30215e9c579404a6e60eb9adc213d73ca0773c3bb5784 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin fa020ab0510f1a48f448a5a93bc30ce8b984c73e6855b667f0f820e0ef4b0ecd +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin bc351871c8749c4d7d2ea05c0a72c9ff3de8cbb2b3438e7d6cc8cc2e3958764b 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 b24ddc90b532eaeb93088ab10339ac0c0310d1f14f0f32f48cdef569f59f6267 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 7bac5b635f48f56b579050796b43df59b9fb7cb7ef3f986ab056202bc2eefa0d 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 4137d04db6c1cce78b30f97acd46aa9562cc2d23 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 9 Jul 2024 14:39:41 -0400 Subject: [PATCH 37/61] fill in coverage gaps --- contracts/gas-snapshots/ccip.gas-snapshot | 37 ++-- .../ccip/applications/external/CCIPClient.sol | 20 ++ .../external/CCIPReceiverWithACK.sol | 6 +- .../external/CCIPClientTest.t.sol | 171 ++++++++++++++++++ .../external/CCIPClientWithACKTest.t.sol | 32 ++++ .../external/CCIPReceiverWithAckTest.t.sol | 4 +- .../external/CCIPSenderTest.t.sol | 6 +- .../internal/PingPongDemoTest.t.sol | 4 + 8 files changed, 257 insertions(+), 23 deletions(-) create mode 100644 contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 8c7653acfb..3935e13fcd 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,10 +34,16 @@ 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_Success() (gas: 331839) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348275) +CCIPClientTest:test_HappyPath_Success() (gas: 192504) +CCIPClientTest:test_ccipReceiveAndSendAck_Success() (gas: 331795) +CCIPClientTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438714) +CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348231) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325792) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218834) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) -CCIPClientTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552173) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376797) +CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) +CCIPClientTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552182) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) @@ -96,14 +102,14 @@ CCIPReceiverTest:test_modifyRouter_Success() (gas: 26446) CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 427653) CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 454419) CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20667) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56277) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331828) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438737) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56278) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331829) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438738) CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2956788) -CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74835) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens() (gas: 339572) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens() (gas: 224467) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens() (gas: 368160) +CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74867) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339615) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224489) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 368159) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -693,9 +699,10 @@ 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: 307350) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17898) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234292) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 307328) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17943) +PingPong_example_plumbing:test_typeAndVersion() (gas: 9745) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234270) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -842,8 +849,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: 289562) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448109) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 289627) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448499) 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 c97b69302b..6643994325 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -18,9 +18,12 @@ contract CCIPClient is CCIPReceiver { IERC20 public s_feeToken; event MessageSent(bytes32 messageId); + event FeeTokenUpdated(address oldFeeToken, address newFeeToken); constructor(address router, IERC20 feeToken) CCIPReceiver(router) { s_feeToken = feeToken; + + IERC20(s_feeToken).safeApprove(s_ccipRouter, type(uint256).max); } /// @notice sends a message through CCIP to the router @@ -79,4 +82,21 @@ contract CCIPClient is CCIPReceiver { isValidSender(message.sourceChainSelector, message.sender) isValidChain(message.sourceChainSelector) {} + + function updateFeeToken(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.safeIncreaseAllowance(getRouter(), type(uint256).max); + } + + emit FeeTokenUpdated(oldFeeToken, token); + } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 31d164fe1c..c2f9639b83 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -24,7 +24,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { event MessageSent(bytes32 indexed incomingMessageId, bytes32 indexed ACKMessageId); event MessageAckReceived(bytes32 messageId); - event FeeTokenModified(address indexed oldToken, address indexed newToken); + event FeeTokenUpdated(address indexed oldToken, address indexed newToken); enum MessageType { OUTGOING, // Indicates that a message is being sent for the first time to its recipient. @@ -61,7 +61,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { } } - function modifyFeeToken(address token) external onlyOwner { + function updateFeeToken(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); @@ -75,7 +75,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { s_feeToken.safeIncreaseAllowance(getRouter(), type(uint256).max); } - emit FeeTokenModified(oldFeeToken, token); + emit FeeTokenUpdated(oldFeeToken, token); } /// @notice Application-specific logic for incoming ccip messages. 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 new file mode 100644 index 0000000000..79b48826b3 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientTest.t.sol @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; +import {CCIPClient} from "../../../applications/external/CCIPClient.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"; + +contract CCIPClientTest is EVM2EVMOnRampSetup { + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageSucceeded(bytes32 indexed messageId); + event MessageRecovered(bytes32 indexed messageId); + + CCIPClient internal s_sender; + + function setUp() public virtual override { + EVM2EVMOnRampSetup.setUp(); + + s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = CCIPBase.ChainUpdate({ + chainSelector: DEST_CHAIN_SELECTOR, + allowed: true, + recipient: abi.encode(address(s_sender)), + extraArgsBytes: "" + }); + s_sender.applyChainUpdates(chainUpdates); + + CCIPBase.ApprovedSenderUpdate[] memory senderUpdates = new CCIPBase.ApprovedSenderUpdate[](1); + senderUpdates[0] = + CCIPBase.ApprovedSenderUpdate({destChainSelector: DEST_CHAIN_SELECTOR, sender: abi.encode(address(s_sender))}); + + s_sender.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); + } + + function test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() 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: ""}); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - amount - feeTokenAmount); + } + + function test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() 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: ""}); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); + } + + function test_modifyFeeToken_Success() public { + // WETH is used as a placeholder for any ERC20 token + address WETH = s_sourceRouter.getWrappedNative(); + + vm.expectEmit(); + emit IERC20.Approval(address(s_sender), address(s_sourceRouter), 0); + + vm.expectEmit(); + emit CCIPClient.FeeTokenUpdated(s_sourceFeeToken, WETH); + + s_sender.updateFeeToken(WETH); + + IERC20 newFeeToken = s_sender.s_feeToken(); + assertEq(address(newFeeToken), WETH); + assertEq(newFeeToken.allowance(address(s_sender), address(s_sourceRouter)), type(uint256).max); + assertEq(IERC20(s_sourceFeeToken).allowance(address(s_sender), address(s_sourceRouter)), 0); + } + + function test_ccipSend_with_NativeFeeToken_andDestTokens_Success() 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}); + + s_sender.updateFeeToken(address(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, + extraArgs: "", + feeToken: address(s_sourceFeeToken) + }); + + 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: "" + }); + + // Assert that native fees are paid successfully and tokens are transferred + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount, "Tokens were not successfully delivered"); + assertEq( + OWNER.balance, nativeFeeTokenBalanceBefore - feeTokenAmount, "Native fee tokens were not successfully forwarded" + ); + } + + 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_sender), amount); + + // The receiver contract will revert if the router is not the sender. + vm.startPrank(address(s_sourceRouter)); + + vm.expectEmit(); + emit MessageSucceeded(messageId); + + s_sender.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: DEST_CHAIN_SELECTOR, + sender: abi.encode(address(s_sender)), // correct sender + data: "", + destTokenAmounts: destTokenAmounts + }) + ); + } +} diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index b867637b08..7907c25e8d 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -45,6 +45,38 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { s_sender.updateApprovedSenders(senderUpdates, new CCIPBase.ApprovedSenderUpdate[](0)); } + 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 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 Ack Message Header + vm.expectEmit(); + emit MessageFailed(messageId, abi.encodeWithSelector(bytes4(CCIPReceiverWithACK.InvalidAckMessageHeader.selector))); + + s_sender.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_sender)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + + // Check that message status is failed + assertEq(s_sender.getMessageStatus(messageId), 1); + } + function test_ccipReceiveAndSendAck_Success() public { bytes32 messageId = keccak256("messageId"); bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; 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 de0f4bf800..a5608814ea 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 @@ -161,9 +161,9 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { emit IERC20.Approval(address(s_receiver), address(s_sourceRouter), 0); vm.expectEmit(); - emit CCIPReceiverWithACK.FeeTokenModified(s_sourceFeeToken, WETH); + emit CCIPReceiverWithACK.FeeTokenUpdated(s_sourceFeeToken, WETH); - s_receiver.modifyFeeToken(WETH); + s_receiver.updateFeeToken(WETH); IERC20 newFeeToken = s_receiver.s_feeToken(); assertEq(address(newFeeToken), WETH); 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 5e74236b41..34be7d94c4 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 @@ -32,7 +32,7 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { s_sender.applyChainUpdates(chainUpdates); } - function test_ccipSend_withNonNativeFeetoken_andDestTokens() public { + function test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() public { address token = address(s_sourceFeeToken); uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); @@ -63,7 +63,7 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - amount - feeTokenAmount); } - function test_ccipSend_withNonNativeFeetoken_andNoDestTokens() public { + function test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() public { address token = address(s_sourceFeeToken); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -92,7 +92,7 @@ contract CCIPSenderTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } - function test_ccipSend_with_NativeFeeToken_andDestTokens() public { + function test_ccipSend_with_NativeFeeToken_andDestTokens_Success() public { address token = address(s_sourceFeeToken); uint256 amount = 111333333777; Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](1); diff --git a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol index feb8b2ff7f..268680843a 100644 --- a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol @@ -120,4 +120,8 @@ contract PingPong_example_plumbing is PingPongDappSetup { assertTrue(s_pingPong.isPaused()); } + + function test_typeAndVersion() public view { + assertEq(s_pingPong.typeAndVersion(), "PingPongDemo 1.3.0"); + } } From ae26d9b3b36cc2e5b844640de6fc173a2cc5014d 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, 9 Jul 2024 18:48:30 +0000 Subject: [PATCH 38/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 148 +++++++++++++++++- .../ping_pong_demo/ping_pong_demo.go | 82 +++++----- .../self_funded_ping_pong.go | 82 +++++----- ...rapper-dependency-versions-do-not-edit.txt | 8 +- 4 files changed, 232 insertions(+), 88 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 8bf9c89544..345351e6a6 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162003bf038038062003bf08339810160408190526200003491620001e8565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000124565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600880549490921693169290921790915550620002279050565b336001600160a01b038216036200017e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620001e557600080fd5b50565b60008060408385031215620001fc57600080fd5b82516200020981620001cf565b60208401519092506200021c81620001cf565b809150509250929050565b6139b980620002376000396000f3fe6080604052600436106101485760003560e01c806385572ffb116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103c0578063f2fde38b146103d3578063ff2deec3146103f357600080fd5b8063cf6730f814610380578063e4ca8754146103a057600080fd5b80639fe74e26116100a55780639fe74e2614610315578063b0f479a114610335578063c851cc321461036057600080fd5b806385572ffb146102a95780638da5cb5b146102c957600080fd5b80635e35359e116101175780636d62d633116100fc5780636d62d6331461025457806379ba5097146102745780638462a2b91461028957600080fd5b80635e35359e146102075780636939cd971461022757600080fd5b80630e958d6b1461015457806335f170ef146101895780635075a9d4146101b7578063536c6bfa146101e557600080fd5b3661014f57005b600080fd5b34801561016057600080fd5b5061017461016f366004612a73565b610420565b60405190151581526020015b60405180910390f35b34801561019557600080fd5b506101a96101a4366004612af8565b61046b565b604051610180929190612b83565b3480156101c357600080fd5b506101d76101d2366004612bb1565b610597565b604051908152602001610180565b3480156101f157600080fd5b50610205610200366004612bec565b6105aa565b005b34801561021357600080fd5b50610205610222366004612c18565b61060e565b34801561023357600080fd5b50610247610242366004612bb1565b6106a3565b6040516101809190612cb6565b34801561026057600080fd5b5061020561026f366004612d4a565b6108ae565b34801561028057600080fd5b50610205610bc8565b34801561029557600080fd5b506102056102a4366004612dc6565b610cc5565b3480156102b557600080fd5b506102056102c4366004612e32565b611006565b3480156102d557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610180565b34801561032157600080fd5b50610205610330366004612e6d565b61120f565b34801561034157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102f0565b34801561036c57600080fd5b5061020561037b366004612eaf565b6115a0565b34801561038c57600080fd5b5061020561039b366004612e32565b61166c565b3480156103ac57600080fd5b506102056103bb366004612bb1565b611825565b6101d76103ce366004613001565b611a8f565b3480156103df57600080fd5b506102056103ee366004612eaf565b611f9c565b3480156103ff57600080fd5b506008546102f09073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061044f908590859061310e565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104869061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b29061311e565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050908060010180546105149061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546105409061311e565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050905082565b60006105a4600583611fb0565b92915050565b6105b2611fc3565b6105bc8282612046565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610616611fc3565b61063773ffffffffffffffffffffffffffffffffffffffff841683836121a0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161069691815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107129061311e565b80601f016020809104026020016040519081016040528092919081815260200182805461073e9061311e565b801561078b5780601f106107605761010080835404028352916020019161078b565b820191906000526020600020905b81548152906001019060200180831161076e57829003601f168201915b505050505081526020016003820180546107a49061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546107d09061311e565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108a05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161084b565b505050915250909392505050565b6108b6611fc3565b60016108c3600584611fb0565b14610902576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109128260025b60059190612274565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161095a9061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546109869061311e565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b505050505081526020016003820180546109ec9061311e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a189061311e565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610ae85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a93565b5050505081525050905060005b816080015151811015610b7757610b6f8383608001518381518110610b1c57610b1c613171565b60200260200101516020015184608001518481518110610b3e57610b3e613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166121a09092919063ffffffff16565b600101610af5565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108f9565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ccd611fc3565b60005b81811015610e605760036000848484818110610cee57610cee613171565b9050602002810190610d0091906131a0565b610d0e906020810190612af8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d4557610d45613171565b9050602002810190610d5791906131a0565b610d659060208101906131de565b604051610d7392919061310e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610dba57610dba613171565b9050602002810190610dcc91906131a0565b610dda9060208101906131de565b604051610de892919061310e565b6040518091039020838383818110610e0257610e02613171565b9050602002810190610e1491906131a0565b610e22906020810190612af8565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610cd0565b5060005b83811015610fff57600160036000878785818110610e8457610e84613171565b9050602002810190610e9691906131a0565b610ea4906020810190612af8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610edb57610edb613171565b9050602002810190610eed91906131a0565b610efb9060208101906131de565b604051610f0992919061310e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f5957610f59613171565b9050602002810190610f6b91906131a0565b610f799060208101906131de565b604051610f8792919061310e565b6040518091039020858583818110610fa157610fa1613171565b9050602002810190610fb391906131a0565b610fc1906020810190612af8565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e64565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611059576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108f9565b6110696040820160208301612af8565b67ffffffffffffffff811660009081526003602052604090208054819061108f9061311e565b90506000036110d6576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108f9565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611112908690600401613345565b600060405180830381600087803b15801561112c57600080fd5b505af192505050801561113d575060015b6111dd573d80801561116b576040519150601f19603f3d011682016040523d82523d6000602084013e611170565b606091505b5061117d84356001610909565b5083356000908152600460205260409020849061119a8282613717565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906111cf908490613811565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611217611fc3565b60005b8181101561120a5782828281811061123457611234613171565b90506020028101906112469190613824565b611257906040810190602001613866565b611323576003600084848481811061127157611271613171565b90506020028101906112839190613824565b611291906020810190612af8565b67ffffffffffffffff168152602081019190915260400160009081206112b691612a0f565b8282828181106112c8576112c8613171565b90506020028101906112da9190613824565b6112e8906020810190612af8565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611598565b82828281811061133557611335613171565b90506020028101906113479190613824565b6113559060408101906131de565b9050600003611390576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113a8576113a8613171565b90506020028101906113ba9190613824565b6113c8906020810190612af8565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106113fe576113fe613171565b90506020028101906114109190613824565b61141e9060408101906131de565b829161142b9190836134a3565b5083838381811061143e5761143e613171565b90506020028101906114509190613824565b61145e9060608101906131de565b1590506114a95783838381811061147757611477613171565b90506020028101906114899190613824565b6114979060608101906131de565b60018301916114a79190836134a3565b505b8383838181106114bb576114bb613171565b90506020028101906114cd9190613824565b6114db9060408101906131de565b6040516114e992919061310e565b604051809103902084848481811061150357611503613171565b90506020028101906115159190613824565b611523906020810190612af8565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061156057611560613171565b90506020028101906115729190613824565b6115809060608101906131de565b60405161158e929190613883565b60405180910390a3505b60010161121a565b6115a8611fc3565b73ffffffffffffffffffffffffffffffffffffffff81166115f5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146116a5576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b56040820160208301612af8565b6116c260408301836131de565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506117199250905061311e565b1590508061176f5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161175a9190613897565b9081526040519081900360200190205460ff16155b156117a857806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108f99190613811565b6117b86040840160208501612af8565b67ffffffffffffffff81166000908152600360205260409020805481906117de9061311e565b9050600003610fff576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108f9565b6001611832600583611fb0565b1461186c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108f9565b611877816000610909565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916118bf9061311e565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb9061311e565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b505050505081526020016003820180546119519061311e565b80601f016020809104026020016040519081016040528092919081815260200182805461197d9061311e565b80156119ca5780601f1061199f576101008083540402835291602001916119ca565b820191906000526020600020905b8154815290600101906020018083116119ad57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611a4d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016119f8565b50505050815250509050611a6081612289565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ab89061311e565b9050600003611aff576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108f9565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611b2f9061311e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5b9061311e565b8015611ba85780601f10611b7d57610100808354040283529160200191611ba8565b820191906000526020600020905b815481529060010190602001808311611b8b57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611c099061311e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c359061311e565b8015611c825780601f10611c5757610100808354040283529160200191611c82565b820191906000526020600020905b815481529060010190602001808311611c6557829003601f168201915b5050505050815250905060005b8651811015611ddf57611cff3330898481518110611caf57611caf613171565b6020026020010151602001518a8581518110611ccd57611ccd613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122fb909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611d2f57611d2f613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611dd7576002548751611dd79173ffffffffffffffffffffffffffffffffffffffff1690899084908110611d8857611d88613171565b602002602001015160200151898481518110611da657611da6613171565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661235f9092919063ffffffff16565b600101611c8f565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611e39908b9086906004016138a9565b602060405180830381865afa158015611e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7a9190613976565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615611ec057600854611ec09073ffffffffffffffffffffffffffffffffffffffff163330846122fb565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611ef2576000611ef4565b825b8a856040518463ffffffff1660e01b8152600401611f139291906138a9565b60206040518083038185885af1158015611f31573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f569190613976565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611f8991815260200190565b60405180910390a1505050509392505050565b611fa4611fc3565b611fad816124e1565b50565b6000611fbc83836125d6565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108f9565b565b804710156120b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108f9565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461210a576040519150601f19603f3d011682016040523d82523d6000602084013e61210f565b606091505b505090508061120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108f9565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261120a9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612660565b600061228184848461276c565b949350505050565b612291611fc3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906122cd908490600401612cb6565b600060405180830381600087803b1580156122e757600080fd5b505af1158015610fff573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123599085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016121f2565b50505050565b8015806123ff57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd9190613976565b155b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108f9565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261120a9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016121f2565b3373ffffffffffffffffffffffffffffffffffffffff821603612560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108f9565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806125fa57506125fa8484612789565b611fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016108f9565b60006126c2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127959092919063ffffffff16565b80519091501561120a57808060200190518101906126e0919061398f565b61120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108f9565b6000828152600284016020526040812082905561228184846127a4565b6000611fbc83836127b0565b606061228184846000856127c8565b6000611fbc83836128e1565b60008181526001830160205260408120541515611fbc565b60608247101561285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108f9565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128839190613897565b60006040518083038185875af1925050503d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b50915091506128d687838387612930565b979650505050505050565b6000818152600183016020526040812054612928575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105a4565b5060006105a4565b606083156129c65782516000036129bf5773ffffffffffffffffffffffffffffffffffffffff85163b6129bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108f9565b5081612281565b61228183838151156129db5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f99190613811565b508054612a1b9061311e565b6000825580601f10612a2b575050565b601f016020900490600052602060002090810190611fad91905b80821115612a595760008155600101612a45565b5090565b67ffffffffffffffff81168114611fad57600080fd5b600080600060408486031215612a8857600080fd5b8335612a9381612a5d565b9250602084013567ffffffffffffffff80821115612ab057600080fd5b818601915086601f830112612ac457600080fd5b813581811115612ad357600080fd5b876020828501011115612ae557600080fd5b6020830194508093505050509250925092565b600060208284031215612b0a57600080fd5b8135611fbc81612a5d565b60005b83811015612b30578181015183820152602001612b18565b50506000910152565b60008151808452612b51816020860160208601612b15565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612b966040830185612b39565b8281036020840152612ba88185612b39565b95945050505050565b600060208284031215612bc357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611fad57600080fd5b60008060408385031215612bff57600080fd5b8235612c0a81612bca565b946020939093013593505050565b600080600060608486031215612c2d57600080fd5b8335612c3881612bca565b92506020840135612c4881612bca565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612cab578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612c6e565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612cf060c0840182612b39565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d2c8383612b39565b925060808601519150808584030160a086015250612ba88282612c59565b60008060408385031215612d5d57600080fd5b823591506020830135612d6f81612bca565b809150509250929050565b60008083601f840112612d8c57600080fd5b50813567ffffffffffffffff811115612da457600080fd5b6020830191508360208260051b8501011115612dbf57600080fd5b9250929050565b60008060008060408587031215612ddc57600080fd5b843567ffffffffffffffff80821115612df457600080fd5b612e0088838901612d7a565b90965094506020870135915080821115612e1957600080fd5b50612e2687828801612d7a565b95989497509550505050565b600060208284031215612e4457600080fd5b813567ffffffffffffffff811115612e5b57600080fd5b820160a08185031215611fbc57600080fd5b60008060208385031215612e8057600080fd5b823567ffffffffffffffff811115612e9757600080fd5b612ea385828601612d7a565b90969095509350505050565b600060208284031215612ec157600080fd5b8135611fbc81612bca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f1e57612f1e612ecc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f6b57612f6b612ecc565b604052919050565b600082601f830112612f8457600080fd5b813567ffffffffffffffff811115612f9e57612f9e612ecc565b612fcf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f24565b818152846020838601011115612fe457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561301657600080fd5b833561302181612a5d565b925060208481013567ffffffffffffffff8082111561303f57600080fd5b818701915087601f83011261305357600080fd5b81358181111561306557613065612ecc565b613073848260051b01612f24565b81815260069190911b8301840190848101908a83111561309257600080fd5b938501935b828510156130de576040858c0312156130b05760008081fd5b6130b8612efb565b85356130c381612bca565b81528587013587820152825260409094019390850190613097565b9650505060408701359250808311156130f657600080fd5b505061310486828701612f73565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061313257607f821691505b60208210810361316b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126131d457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261321357600080fd5b83018035915067ffffffffffffffff82111561322e57600080fd5b602001915036819003821315612dbf57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261327857600080fd5b830160208101925035905067ffffffffffffffff81111561329857600080fd5b803603821315612dbf57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612cab57813561331381612bca565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613300565b60208152813560208201526000602083013561336081612a5d565b67ffffffffffffffff808216604085015261337e6040860186613243565b925060a0606086015261339560c0860184836132a7565b9250506133a56060860186613243565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526133db8583856132a7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261341457600080fd5b6020928801928301923591508382111561342d57600080fd5b8160061b360383131561343f57600080fd5b8685030160a08701526128d68482846132f0565b601f82111561120a576000816000526020600020601f850160051c8101602086101561347c5750805b601f850160051c820191505b8181101561349b57828155600101613488565b505050505050565b67ffffffffffffffff8311156134bb576134bb612ecc565b6134cf836134c9835461311e565b83613453565b6000601f84116001811461352157600085156134eb5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fff565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135705786850135825560209485019460019092019101613550565b50868210156135ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216821461361a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b813561362a81612bca565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561369057613690612ecc565b8054838255808410156136e2576136a6816135bd565b6136af856135bd565b6000848152602081209283019291909101905b828210156136de578082558060018301556002820191506136c2565b5050505b5060008181526020812083915b8581101561349b57613701838361361f565b60409290920191600291909101906001016136ef565b8135815560018101602083013561372d81612a5d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561376d60408601866131de565b9350915061377f8383600287016134a3565b61378c60608601866131de565b9350915061379e8383600387016134a3565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126137d557600080fd5b9184019182359150808211156137ea57600080fd5b506020820191508060061b360382131561380357600080fd5b612359818360048601613677565b602081526000611fbc6020830184612b39565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126131d457600080fd5b8015158114611fad57600080fd5b60006020828403121561387857600080fd5b8135611fbc81613858565b6020815260006122816020830184866132a7565b600082516131d4818460208701612b15565b67ffffffffffffffff83168152604060208201526000825160a060408401526138d560e0840182612b39565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526139118383612b39565b9250604086015191508085840301608086015261392e8383612c59565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061396c8282612b39565b9695505050505050565b60006020828403121561398857600080fd5b5051919050565b6000602082840312156139a157600080fd5b8151611fbc8161385856fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200433d3803806200433d8339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600880549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613c7780620006c66000396000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103fb578063f2fde38b1461040e578063ff2deec31461042e57600080fd5b8063cf6730f8146103bb578063e4ca8754146103db57600080fd5b8063b0f479a1116100a5578063b0f479a114610350578063c851cc321461037b578063c89245d51461039b57600080fd5b80638da5cb5b146102e45780639fe74e261461033057600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba50971461028f5780638462a2b9146102a457806385572ffb146102c457600080fd5b80636939cd97146102425780636d62d6331461026f57600080fd5b80635075a9d4116101485780635075a9d4146101d2578063536c6bfa146102005780635e35359e1461022257600080fd5b80630e958d6b1461016f57806335f170ef146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612d16565b61045b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004612d9b565b6104a6565b60405161019b929190612e26565b3480156101de57600080fd5b506101f26101ed366004612e54565b6105d2565b60405190815260200161019b565b34801561020c57600080fd5b5061022061021b366004612e8f565b6105e5565b005b34801561022e57600080fd5b5061022061023d366004612ebb565b610649565b34801561024e57600080fd5b5061026261025d366004612e54565b6106de565b60405161019b9190612f59565b34801561027b57600080fd5b5061022061028a366004612fed565b6108e9565b34801561029b57600080fd5b50610220610c03565b3480156102b057600080fd5b506102206102bf366004613069565b610d00565b3480156102d057600080fd5b506102206102df3660046130d5565b611041565b3480156102f057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561033c57600080fd5b5061022061034b366004613110565b61124a565b34801561035c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661030b565b34801561038757600080fd5b50610220610396366004613152565b6115db565b3480156103a757600080fd5b506102206103b6366004613152565b6116a7565b3480156103c757600080fd5b506102206103d63660046130d5565b611811565b3480156103e757600080fd5b506102206103f6366004612e54565b6119ca565b6101f26104093660046132a4565b611c34565b34801561041a57600080fd5b50610220610429366004613152565b612141565b34801561043a57600080fd5b5060085461030b9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061048a90859085906133b1565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104c1906133c1565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed906133c1565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b50505050509080600101805461054f906133c1565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906133c1565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905082565b60006105df600583612155565b92915050565b6105ed612168565b6105f782826121eb565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610651612168565b61067273ffffffffffffffffffffffffffffffffffffffff84168383612345565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106d191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161074d906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610779906133c1565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b505050505081526020016003820180546107df906133c1565b80601f016020809104026020016040519081016040528092919081815260200182805461080b906133c1565b80156108585780601f1061082d57610100808354040283529160200191610858565b820191906000526020600020905b81548152906001019060200180831161083b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108db5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610886565b505050915250909392505050565b6108f1612168565b60016108fe600584612155565b1461093d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61094d8260025b60059190612419565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610995906133c1565b80601f01602080910402602001604051908101604052809291908181526020018280546109c1906133c1565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b50505050508152602001600382018054610a27906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a53906133c1565b8015610aa05780601f10610a7557610100808354040283529160200191610aa0565b820191906000526020600020905b815481529060010190602001808311610a8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ace565b5050505081525050905060005b816080015151811015610bb257610baa8383608001518381518110610b5757610b57613414565b60200260200101516020015184608001518481518110610b7957610b79613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123459092919063ffffffff16565b600101610b30565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610934565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d08612168565b60005b81811015610e9b5760036000848484818110610d2957610d29613414565b9050602002810190610d3b9190613443565b610d49906020810190612d9b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d8057610d80613414565b9050602002810190610d929190613443565b610da0906020810190613481565b604051610dae9291906133b1565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610df557610df5613414565b9050602002810190610e079190613443565b610e15906020810190613481565b604051610e239291906133b1565b6040518091039020838383818110610e3d57610e3d613414565b9050602002810190610e4f9190613443565b610e5d906020810190612d9b565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d0b565b5060005b8381101561103a57600160036000878785818110610ebf57610ebf613414565b9050602002810190610ed19190613443565b610edf906020810190612d9b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f1657610f16613414565b9050602002810190610f289190613443565b610f36906020810190613481565b604051610f449291906133b1565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f9457610f94613414565b9050602002810190610fa69190613443565b610fb4906020810190613481565b604051610fc29291906133b1565b6040518091039020858583818110610fdc57610fdc613414565b9050602002810190610fee9190613443565b610ffc906020810190612d9b565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e9f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611094576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6110a46040820160208301612d9b565b67ffffffffffffffff81166000908152600360205260409020805481906110ca906133c1565b9050600003611111576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061114d9086906004016135e8565b600060405180830381600087803b15801561116757600080fd5b505af1925050508015611178575060015b611218573d8080156111a6576040519150601f19603f3d011682016040523d82523d6000602084013e6111ab565b606091505b506111b884356001610944565b508335600090815260046020526040902084906111d582826139c2565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061120a908490613abc565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611252612168565b60005b818110156112455782828281811061126f5761126f613414565b90506020028101906112819190613acf565b611292906040810190602001613b11565b61135e57600360008484848181106112ac576112ac613414565b90506020028101906112be9190613acf565b6112cc906020810190612d9b565b67ffffffffffffffff168152602081019190915260400160009081206112f191612cb2565b82828281811061130357611303613414565b90506020028101906113159190613acf565b611323906020810190612d9b565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26115d3565b82828281811061137057611370613414565b90506020028101906113829190613acf565b611390906040810190613481565b90506000036113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113e3576113e3613414565b90506020028101906113f59190613acf565b611403906020810190612d9b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061143957611439613414565b905060200281019061144b9190613acf565b611459906040810190613481565b8291611466919083613746565b5083838381811061147957611479613414565b905060200281019061148b9190613acf565b611499906060810190613481565b1590506114e4578383838181106114b2576114b2613414565b90506020028101906114c49190613acf565b6114d2906060810190613481565b60018301916114e2919083613746565b505b8383838181106114f6576114f6613414565b90506020028101906115089190613acf565b611516906040810190613481565b6040516115249291906133b1565b604051809103902084848481811061153e5761153e613414565b90506020028101906115509190613acf565b61155e906020810190612d9b565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061159b5761159b613414565b90506020028101906115ad9190613acf565b6115bb906060810190613481565b6040516115c9929190613b2e565b60405180910390a3505b600101611255565b6115e3612168565b73ffffffffffffffffffffffffffffffffffffffff8116611630576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6116af612168565b60085473ffffffffffffffffffffffffffffffffffffffff1615611710576117106116ef60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff1690600061242e565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156117bd576117bd61177d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6125b0565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461184a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185a6040820160208301612d9b565b6118676040830183613481565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506118be925090506133c1565b159050806119145750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516118ff9190613b42565b9081526040519081900360200190205460ff16155b1561194d57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109349190613abc565b61195d6040840160208501612d9b565b67ffffffffffffffff8116600090815260036020526040902080548190611983906133c1565b905060000361103a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b60016119d7600583612155565b14611a11576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610934565b611a1c816000610944565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611a64906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a90906133c1565b8015611add5780601f10611ab257610100808354040283529160200191611add565b820191906000526020600020905b815481529060010190602001808311611ac057829003601f168201915b50505050508152602001600382018054611af6906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b22906133c1565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611bf25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611b9d565b50505050815250509050611c05816126b4565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c5d906133c1565b9050600003611ca4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611cd4906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d00906133c1565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611dae906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda906133c1565b8015611e275780601f10611dfc57610100808354040283529160200191611e27565b820191906000526020600020905b815481529060010190602001808311611e0a57829003601f168201915b5050505050815250905060005b8651811015611f8457611ea43330898481518110611e5457611e54613414565b6020026020010151602001518a8581518110611e7257611e72613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612726909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611ed457611ed4613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611f7c576002548751611f7c9173ffffffffffffffffffffffffffffffffffffffff1690899084908110611f2d57611f2d613414565b602002602001015160200151898481518110611f4b57611f4b613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661242e9092919063ffffffff16565b600101611e34565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611fde908b908690600401613b54565b602060405180830381865afa158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f9190613c21565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612065576008546120659073ffffffffffffffffffffffffffffffffffffffff16333084612726565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612097576000612099565b825b8a856040518463ffffffff1660e01b81526004016120b8929190613b54565b60206040518083038185885af11580156120d6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120fb9190613c21565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161212e91815260200190565b60405180910390a1505050509392505050565b612149612168565b61215281612784565b50565b60006121618383612879565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610934565b565b80471015612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122af576040519150601f19603f3d011682016040523d82523d6000602084013e6122b4565b606091505b5050905080611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612903565b6000612426848484612a0f565b949350505050565b8015806124ce57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cc9190613c21565b155b61255a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612397565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264b9190613c21565b6126559190613c3a565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126ae9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612397565b50505050565b6126bc612168565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906126f8908490600401612f59565b600060405180830381600087803b15801561271257600080fd5b505af115801561103a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126ae9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612397565b3373ffffffffffffffffffffffffffffffffffffffff821603612803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610934565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061289d575061289d8484612a2c565b612161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610934565b6000612965826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a389092919063ffffffff16565b80519091501561124557808060200190518101906129839190613c4d565b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610934565b600082815260028401602052604081208290556124268484612a47565b60006121618383612a53565b60606124268484600085612a6b565b60006121618383612b84565b60008181526001830160205260408120541515612161565b606082471015612afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610934565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b269190613b42565b60006040518083038185875af1925050503d8060008114612b63576040519150601f19603f3d011682016040523d82523d6000602084013e612b68565b606091505b5091509150612b7987838387612bd3565b979650505050505050565b6000818152600183016020526040812054612bcb575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105df565b5060006105df565b60608315612c69578251600003612c625773ffffffffffffffffffffffffffffffffffffffff85163b612c62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b5081612426565b6124268383815115612c7e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349190613abc565b508054612cbe906133c1565b6000825580601f10612cce575050565b601f01602090049060005260206000209081019061215291905b80821115612cfc5760008155600101612ce8565b5090565b67ffffffffffffffff8116811461215257600080fd5b600080600060408486031215612d2b57600080fd5b8335612d3681612d00565b9250602084013567ffffffffffffffff80821115612d5357600080fd5b818601915086601f830112612d6757600080fd5b813581811115612d7657600080fd5b876020828501011115612d8857600080fd5b6020830194508093505050509250925092565b600060208284031215612dad57600080fd5b813561216181612d00565b60005b83811015612dd3578181015183820152602001612dbb565b50506000910152565b60008151808452612df4816020860160208601612db8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612e396040830185612ddc565b8281036020840152612e4b8185612ddc565b95945050505050565b600060208284031215612e6657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461215257600080fd5b60008060408385031215612ea257600080fd5b8235612ead81612e6d565b946020939093013593505050565b600080600060608486031215612ed057600080fd5b8335612edb81612e6d565b92506020840135612eeb81612e6d565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612f4e578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612f11565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612f9360c0840182612ddc565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612fcf8383612ddc565b925060808601519150808584030160a086015250612e4b8282612efc565b6000806040838503121561300057600080fd5b82359150602083013561301281612e6d565b809150509250929050565b60008083601f84011261302f57600080fd5b50813567ffffffffffffffff81111561304757600080fd5b6020830191508360208260051b850101111561306257600080fd5b9250929050565b6000806000806040858703121561307f57600080fd5b843567ffffffffffffffff8082111561309757600080fd5b6130a38883890161301d565b909650945060208701359150808211156130bc57600080fd5b506130c98782880161301d565b95989497509550505050565b6000602082840312156130e757600080fd5b813567ffffffffffffffff8111156130fe57600080fd5b820160a0818503121561216157600080fd5b6000806020838503121561312357600080fd5b823567ffffffffffffffff81111561313a57600080fd5b6131468582860161301d565b90969095509350505050565b60006020828403121561316457600080fd5b813561216181612e6d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131c1576131c161316f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561320e5761320e61316f565b604052919050565b600082601f83011261322757600080fd5b813567ffffffffffffffff8111156132415761324161316f565b61327260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016131c7565b81815284602083860101111561328757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156132b957600080fd5b83356132c481612d00565b925060208481013567ffffffffffffffff808211156132e257600080fd5b818701915087601f8301126132f657600080fd5b8135818111156133085761330861316f565b613316848260051b016131c7565b81815260069190911b8301840190848101908a83111561333557600080fd5b938501935b82851015613381576040858c0312156133535760008081fd5b61335b61319e565b853561336681612e6d565b8152858701358782015282526040909401939085019061333a565b96505050604087013592508083111561339957600080fd5b50506133a786828701613216565b9150509250925092565b8183823760009101908152919050565b600181811c908216806133d557607f821691505b60208210810361340e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261347757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126134b657600080fd5b83018035915067ffffffffffffffff8211156134d157600080fd5b60200191503681900382131561306257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261351b57600080fd5b830160208101925035905067ffffffffffffffff81111561353b57600080fd5b80360382131561306257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612f4e5781356135b681612e6d565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016135a3565b60208152813560208201526000602083013561360381612d00565b67ffffffffffffffff808216604085015261362160408601866134e6565b925060a0606086015261363860c08601848361354a565b92505061364860608601866134e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261367e85838561354a565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126136b757600080fd5b602092880192830192359150838211156136d057600080fd5b8160061b36038313156136e257600080fd5b8685030160a0870152612b79848284613593565b601f821115611245576000816000526020600020601f850160051c8101602086101561371f5750805b601f850160051c820191505b8181101561373e5782815560010161372b565b505050505050565b67ffffffffffffffff83111561375e5761375e61316f565b6137728361376c83546133c1565b836136f6565b6000601f8411600181146137c4576000851561378e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561103a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561381357868501358255602094850194600190920191016137f3565b508682101561384e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561389a81612e6d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156139005761390061316f565b80548382558084101561398d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461394157613941613860565b808616861461395257613952613860565b5060008360005260206000208360011b81018760011b820191505b8082101561398857828255828483015560028201915061396d565b505050505b5060008181526020812083915b8581101561373e576139ac838361388f565b604092909201916002919091019060010161399a565b813581556001810160208301356139d881612d00565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613a186040860186613481565b93509150613a2a838360028701613746565b613a376060860186613481565b93509150613a49838360038701613746565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613a8057600080fd5b918401918235915080821115613a9557600080fd5b506020820191508060061b3603821315613aae57600080fd5b6126ae8183600486016138e7565b6020815260006121616020830184612ddc565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261347757600080fd5b801515811461215257600080fd5b600060208284031215613b2357600080fd5b813561216181613b03565b60208152600061242660208301848661354a565b60008251613477818460208701612db8565b67ffffffffffffffff83168152604060208201526000825160a06040840152613b8060e0840182612ddc565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613bbc8383612ddc565b92506040860151915080858403016080860152613bd98383612efc565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613c178282612ddc565b9695505050505050565b600060208284031215613c3357600080fd5b5051919050565b808201808211156105df576105df613860565b600060208284031215613c5f57600080fd5b815161216181613b0356fea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -466,6 +466,18 @@ func (_CCIPClient *CCIPClientTransactorSession) UpdateApprovedSenders(adds []CCI return _CCIPClient.Contract.UpdateApprovedSenders(&_CCIPClient.TransactOpts, adds, removes) } +func (_CCIPClient *CCIPClientTransactor) UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "updateFeeToken", token) +} + +func (_CCIPClient *CCIPClientSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateFeeToken(&_CCIPClient.TransactOpts, token) +} + +func (_CCIPClient *CCIPClientTransactorSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdateFeeToken(&_CCIPClient.TransactOpts, token) +} + func (_CCIPClient *CCIPClientTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "updateRouter", newRouter) } @@ -1186,6 +1198,124 @@ func (_CCIPClient *CCIPClientFilterer) ParseChainRemoved(log types.Log) (*CCIPCl return event, nil } +type CCIPClientFeeTokenUpdatedIterator struct { + Event *CCIPClientFeeTokenUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientFeeTokenUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientFeeTokenUpdated) + 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(CCIPClientFeeTokenUpdated) + 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 *CCIPClientFeeTokenUpdatedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientFeeTokenUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientFeeTokenUpdated struct { + OldFeeToken common.Address + NewFeeToken common.Address + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts) (*CCIPClientFeeTokenUpdatedIterator, error) { + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "FeeTokenUpdated") + if err != nil { + return nil, err + } + return &CCIPClientFeeTokenUpdatedIterator{contract: _CCIPClient.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientFeeTokenUpdated) (event.Subscription, error) { + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "FeeTokenUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientFeeTokenUpdated) + if err := _CCIPClient.contract.UnpackLog(event, "FeeTokenUpdated", 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) ParseFeeTokenUpdated(log types.Log) (*CCIPClientFeeTokenUpdated, error) { + event := new(CCIPClientFeeTokenUpdated) + if err := _CCIPClient.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CCIPClientMessageAbandonedIterator struct { Event *CCIPClientMessageAbandoned @@ -2239,6 +2369,8 @@ func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, err return _CCIPClient.ParseChainAdded(log) case _CCIPClient.abi.Events["ChainRemoved"].ID: return _CCIPClient.ParseChainRemoved(log) + case _CCIPClient.abi.Events["FeeTokenUpdated"].ID: + return _CCIPClient.ParseFeeTokenUpdated(log) case _CCIPClient.abi.Events["MessageAbandoned"].ID: return _CCIPClient.ParseMessageAbandoned(log) case _CCIPClient.abi.Events["MessageFailed"].ID: @@ -2281,6 +2413,10 @@ func (CCIPClientChainRemoved) Topic() common.Hash { return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") } +func (CCIPClientFeeTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67") +} + func (CCIPClientMessageAbandoned) Topic() common.Hash { return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") } @@ -2352,6 +2488,8 @@ type CCIPClientInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2390,6 +2528,12 @@ type CCIPClientInterface interface { ParseChainRemoved(log types.Log) (*CCIPClientChainRemoved, error) + FilterFeeTokenUpdated(opts *bind.FilterOpts) (*CCIPClientFeeTokenUpdatedIterator, error) + + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientFeeTokenUpdated) (event.Subscription, error) + + ParseFeeTokenUpdated(log types.Log) (*CCIPClientFeeTokenUpdated, error) + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientMessageAbandonedIterator, error) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPClientMessageAbandoned, messageId [][32]byte) (event.Subscription, 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 180ab5dec7..44e8554799 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":[{\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bbf38038062004bbf83398101604081905262000034916200056d565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000149565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013d576200013d6001600160a01b03821683600019620001f4565b50505050505062000692565b336001600160a01b03821603620001a35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c9190620005ac565b620002789190620005c6565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d491869190620002da16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000329906001600160a01b038516908490620003b0565b805190915015620003ab57808060200190518101906200034a9190620005ee565b620003ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003c18484600085620003c9565b949350505050565b6060824710156200042c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b031685876040516200044a91906200063f565b60006040518083038185875af1925050503d806000811462000489576040519150601f19603f3d011682016040523d82523d6000602084013e6200048e565b606091505b509092509050620004a287838387620004ad565b979650505050505050565b606083156200052157825160000362000519576001600160a01b0385163b620005195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003c1565b620003c18383815115620005385781518083602001fd5b8060405162461bcd60e51b81526004016200008891906200065d565b6001600160a01b03811681146200056a57600080fd5b50565b600080604083850312156200058157600080fd5b82516200058e8162000554565b6020840151909250620005a18162000554565b809150509250929050565b600060208284031215620005bf57600080fd5b5051919050565b80820180821115620005e857634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060157600080fd5b815180151581146200061257600080fd5b9392505050565b60005b83811015620006365781810151838201526020016200061c565b50506000910152565b600082516200065381846020870162000619565b9190910192915050565b60208152600082518060208401526200067e81604085016020870162000619565b601f01601f19169190910160400192915050565b61451d80620006a26000396000f3fe6080604052600436106101dc5760003560e01c806379ba509711610102578063b5a1101111610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063b5a11011146105d1578063bee518a4146105f1578063c851cc321461061a578063cf6730f81461063a57600080fd5b80639d2aede5116100d15780639d2aede51461052e5780639fe74e261461054e578063b0f479a11461056e578063b187bd261461059957600080fd5b806379ba5097146104ae5780638462a2b9146104c357806385572ffb146104e35780638da5cb5b1461050357600080fd5b80632b6e5d631161017a5780635e35359e116101495780635e35359e146103f85780636939cd97146104185780636d62d633146104455780636fef519e1461046557600080fd5b80632b6e5d631461032457806335f170ef1461037c5780635075a9d4146103aa578063536c6bfa146103d857600080fd5b806316c38b3c116101b657806316c38b3c14610280578063181f5a77146102a05780631892b906146102ef5780632874d8bf1461030f57600080fd5b806305bfe982146101e85780630e958d6b1461022e57806311e85dff1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004613425565b60096020526000908152604090205460ff1681565b604051610225919061343e565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613495565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e61027936600461353c565b610725565b005b34801561028c57600080fd5b5061027e61029b366004613567565b610899565b3480156102ac57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906135f2565b3480156102fb57600080fd5b5061027e61030a366004613605565b6108f3565b34801561031b57600080fd5b5061027e610936565b34801561033057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561038857600080fd5b5061039c610397366004613605565b610972565b604051610225929190613622565b3480156103b657600080fd5b506103ca6103c5366004613425565b610a9e565b604051908152602001610225565b3480156103e457600080fd5b5061027e6103f3366004613650565b610ab1565b34801561040457600080fd5b5061027e61041336600461367c565b610b15565b34801561042457600080fd5b50610438610433366004613425565b610baa565b604051610225919061371a565b34801561045157600080fd5b5061027e6104603660046137ae565b610db5565b34801561047157600080fd5b506102e26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104ba57600080fd5b5061027e6110cf565b3480156104cf57600080fd5b5061027e6104de36600461382a565b6111cc565b3480156104ef57600080fd5b5061027e6104fe366004613896565b61150d565b34801561050f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610357565b34801561053a57600080fd5b5061027e61054936600461353c565b611716565b34801561055a57600080fd5b5061027e6105693660046138d1565b6117d1565b34801561057a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610357565b3480156105a557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105dd57600080fd5b5061027e6105ec366004613913565b611b62565b3480156105fd57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561062657600080fd5b5061027e61063536600461353c565b611cd2565b34801561064657600080fd5b5061027e610655366004613896565b611d9e565b34801561066657600080fd5b5061027e610675366004613425565b611fbb565b6103ca610688366004613a76565b612225565b34801561069957600080fd5b5061027e6106a836600461353c565b61275b565b3480156106b957600080fd5b506008546103579073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613b83565b9081526040519081900360200190205460ff1690509392505050565b61072d61276f565b60085473ffffffffffffffffffffffffffffffffffffffff161561078e5761078e61076d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006127f0565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561083b5761083b6107fb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6129f0565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b6108a161276f565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6108fb61276f565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b61093e61276f565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556109706001612af4565b565b60036020526000908152604090208054819061098d90613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990613b93565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505090806001018054610a1b90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613b93565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905082565b6000610aab600583612c01565b92915050565b610ab961276f565b610ac38282612c14565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610b1d61276f565b610b3e73ffffffffffffffffffffffffffffffffffffffff84168383612d6e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610b9d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c1990613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4590613b93565b8015610c925780601f10610c6757610100808354040283529160200191610c92565b820191906000526020600020905b815481529060010190602001808311610c7557829003601f168201915b50505050508152602001600382018054610cab90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790613b93565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610da75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d52565b505050915250909392505050565b610dbd61276f565b6001610dca600584612c01565b14610e09576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610e198260025b60059190612dc4565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610e6190613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8d90613b93565b8015610eda5780601f10610eaf57610100808354040283529160200191610eda565b820191906000526020600020905b815481529060010190602001808311610ebd57829003601f168201915b50505050508152602001600382018054610ef390613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1f90613b93565b8015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610fef5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f9a565b5050505081525050905060005b81608001515181101561107e57611076838360800151838151811061102357611023613be6565b6020026020010151602001518460800151848151811061104557611045613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d6e9092919063ffffffff16565b600101610ffc565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e00565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111d461276f565b60005b8181101561136757600360008484848181106111f5576111f5613be6565b90506020028101906112079190613c15565b611215906020810190613605565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061124c5761124c613be6565b905060200281019061125e9190613c15565b61126c906020810190613c53565b60405161127a929190613b83565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106112c1576112c1613be6565b90506020028101906112d39190613c15565b6112e1906020810190613c53565b6040516112ef929190613b83565b604051809103902083838381811061130957611309613be6565b905060200281019061131b9190613c15565b611329906020810190613605565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016111d7565b5060005b838110156115065760016003600087878581811061138b5761138b613be6565b905060200281019061139d9190613c15565b6113ab906020810190613605565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106113e2576113e2613be6565b90506020028101906113f49190613c15565b611402906020810190613c53565b604051611410929190613b83565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061146057611460613be6565b90506020028101906114729190613c15565b611480906020810190613c53565b60405161148e929190613b83565b60405180910390208585838181106114a8576114a8613be6565b90506020028101906114ba9190613c15565b6114c8906020810190613605565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161136b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611560576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e00565b6115706040820160208301613605565b67ffffffffffffffff811660009081526003602052604090208054819061159690613b93565b90506000036115dd576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e00565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611619908690600401613dba565b600060405180830381600087803b15801561163357600080fd5b505af1925050508015611644575060015b6116e4573d808015611672576040519150601f19603f3d011682016040523d82523d6000602084013e611677565b606091505b5061168484356001610e10565b508335600090815260046020526040902084906116a1828261418c565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906116d69084906135f2565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61171e61276f565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906117cd9082614286565b5050565b6117d961276f565b60005b81811015611711578282828181106117f6576117f6613be6565b905060200281019061180891906143a0565b611819906040810190602001613567565b6118e5576003600084848481811061183357611833613be6565b905060200281019061184591906143a0565b611853906020810190613605565b67ffffffffffffffff16815260208101919091526040016000908120611878916133d7565b82828281811061188a5761188a613be6565b905060200281019061189c91906143a0565b6118aa906020810190613605565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611b5a565b8282828181106118f7576118f7613be6565b905060200281019061190991906143a0565b611917906040810190613c53565b9050600003611952576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061196a5761196a613be6565b905060200281019061197c91906143a0565b61198a906020810190613605565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106119c0576119c0613be6565b90506020028101906119d291906143a0565b6119e0906040810190613c53565b82916119ed919083613f10565b50838383818110611a0057611a00613be6565b9050602002810190611a1291906143a0565b611a20906060810190613c53565b159050611a6b57838383818110611a3957611a39613be6565b9050602002810190611a4b91906143a0565b611a59906060810190613c53565b6001830191611a69919083613f10565b505b838383818110611a7d57611a7d613be6565b9050602002810190611a8f91906143a0565b611a9d906040810190613c53565b604051611aab929190613b83565b6040518091039020848484818110611ac557611ac5613be6565b9050602002810190611ad791906143a0565b611ae5906020810190613605565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611b2257611b22613be6565b9050602002810190611b3491906143a0565b611b42906060810190613c53565b604051611b509291906143d4565b60405180910390a3505b6001016117dc565b611b6a61276f565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611c25916143e8565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906117119082614286565b611cda61276f565b73ffffffffffffffffffffffffffffffffffffffff8116611d27576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b333014611dd7576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611de76040820160208301613605565b611df46040830183613c53565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611e4b92509050613b93565b15905080611ea15750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e8c91906143e8565b9081526040519081900360200190205460ff16155b15611eda57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e0091906135f2565b611eea6040840160208501613605565b67ffffffffffffffff8116600090815260036020526040902080548190611f1090613b93565b9050600003611f57576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e00565b6000611f666060870187613c53565b810190611f739190613425565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611fb357611fb3611fae8260016143fa565b612af4565b505050505050565b6001611fc8600583612c01565b14612002576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e00565b61200d816000610e10565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161205590613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461208190613b93565b80156120ce5780601f106120a3576101008083540402835291602001916120ce565b820191906000526020600020905b8154815290600101906020018083116120b157829003601f168201915b505050505081526020016003820180546120e790613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461211390613b93565b80156121605780601f1061213557610100808354040283529160200191612160565b820191906000526020600020905b81548152906001019060200180831161214357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156121e35760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161218e565b505050508152505090506121f681612dd9565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061224e90613b93565b9050600003612295576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610e00565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906122c590613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546122f190613b93565b801561233e5780601f106123135761010080835404028352916020019161233e565b820191906000526020600020905b81548152906001019060200180831161232157829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161239f90613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546123cb90613b93565b80156124185780601f106123ed57610100808354040283529160200191612418565b820191906000526020600020905b8154815290600101906020018083116123fb57829003601f168201915b5050505050815250905060005b865181101561257557612495333089848151811061244557612445613be6565b6020026020010151602001518a858151811061246357612463613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e4b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106124c5576124c5613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461256d57600254875161256d9173ffffffffffffffffffffffffffffffffffffffff169089908490811061251e5761251e613be6565b60200260200101516020015189848151811061253c5761253c613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127f09092919063ffffffff16565b600101612425565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906125cf908b90869060040161440d565b602060405180830381865afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261091906144da565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612656576008546126569073ffffffffffffffffffffffffffffffffffffffff16333084612e4b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561268857600061268a565b825b8a856040518463ffffffff1660e01b81526004016126a992919061440d565b60206040518083038185885af11580156126c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126ec91906144da565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61276361276f565b61276c81612ea9565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e00565b80158061289057506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561286a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288e91906144da565b155b61291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e00565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117119084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f9e565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b91906144da565b612a9591906143fa565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612aee9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161296e565b50505050565b80600116600103612b37576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b6b565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b600081604051602001612b8091815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a546000808552602085019093529093506117119267ffffffffffffffff90911691612bfa565b6040805180820190915260008082526020820152815260200190600190039081612bd35790505b5083612225565b6000612c0d83836130aa565b9392505050565b80471015612c7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e00565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612cd8576040519150601f19603f3d011682016040523d82523d6000602084013e612cdd565b606091505b5050905080611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e00565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117119084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161296e565b6000612dd1848484613134565b949350505050565b612de161276f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e1d90849060040161371a565b600060405180830381600087803b158015612e3757600080fd5b505af1158015611506573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aee9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161296e565b3373ffffffffffffffffffffffffffffffffffffffff821603612f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e00565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613000826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131519092919063ffffffff16565b805190915015611711578080602001905181019061301e91906144f3565b611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e00565b6000818152600283016020526040812054801515806130ce57506130ce8484613160565b612c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610e00565b60008281526002840160205260408120829055612dd1848461316c565b6060612dd18484600085613178565b6000612c0d8383613291565b6000612c0d83836132a9565b60608247101561320a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e00565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161323391906143e8565b60006040518083038185875af1925050503d8060008114613270576040519150601f19603f3d011682016040523d82523d6000602084013e613275565b606091505b5091509150613286878383876132f8565b979650505050505050565b60008181526001830160205260408120541515612c0d565b60008181526001830160205260408120546132f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aab565b506000610aab565b6060831561338e5782516000036133875773ffffffffffffffffffffffffffffffffffffffff85163b613387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e00565b5081612dd1565b612dd183838151156133a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0091906135f2565b5080546133e390613b93565b6000825580601f106133f3575050565b601f01602090049060005260206000209081019061276c91905b80821115613421576000815560010161340d565b5090565b60006020828403121561343757600080fd5b5035919050565b6020810160038310613479577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461276c57600080fd5b6000806000604084860312156134aa57600080fd5b83356134b58161347f565b9250602084013567ffffffffffffffff808211156134d257600080fd5b818601915086601f8301126134e657600080fd5b8135818111156134f557600080fd5b87602082850101111561350757600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff8116811461276c57600080fd5b60006020828403121561354e57600080fd5b8135612c0d8161351a565b801515811461276c57600080fd5b60006020828403121561357957600080fd5b8135612c0d81613559565b60005b8381101561359f578181015183820152602001613587565b50506000910152565b600081518084526135c0816020860160208601613584565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612c0d60208301846135a8565b60006020828403121561361757600080fd5b8135612c0d8161347f565b60408152600061363560408301856135a8565b828103602084015261364781856135a8565b95945050505050565b6000806040838503121561366357600080fd5b823561366e8161351a565b946020939093013593505050565b60008060006060848603121561369157600080fd5b833561369c8161351a565b925060208401356136ac8161351a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561370f578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136d2565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261375460c08401826135a8565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261379083836135a8565b925060808601519150808584030160a08601525061364782826136bd565b600080604083850312156137c157600080fd5b8235915060208301356137d38161351a565b809150509250929050565b60008083601f8401126137f057600080fd5b50813567ffffffffffffffff81111561380857600080fd5b6020830191508360208260051b850101111561382357600080fd5b9250929050565b6000806000806040858703121561384057600080fd5b843567ffffffffffffffff8082111561385857600080fd5b613864888389016137de565b9096509450602087013591508082111561387d57600080fd5b5061388a878288016137de565b95989497509550505050565b6000602082840312156138a857600080fd5b813567ffffffffffffffff8111156138bf57600080fd5b820160a08185031215612c0d57600080fd5b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b613907858286016137de565b90969095509350505050565b6000806040838503121561392657600080fd5b82356139318161347f565b915060208301356137d38161351a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561399357613993613941565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e0576139e0613941565b604052919050565b600082601f8301126139f957600080fd5b813567ffffffffffffffff811115613a1357613a13613941565b613a4460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613999565b818152846020838601011115613a5957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8b57600080fd5b8335613a968161347f565b925060208481013567ffffffffffffffff80821115613ab457600080fd5b818701915087601f830112613ac857600080fd5b813581811115613ada57613ada613941565b613ae8848260051b01613999565b81815260069190911b8301840190848101908a831115613b0757600080fd5b938501935b82851015613b53576040858c031215613b255760008081fd5b613b2d613970565b8535613b388161351a565b81528587013587820152825260409094019390850190613b0c565b965050506040870135925080831115613b6b57600080fd5b5050613b79868287016139e8565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613ba757607f821691505b602082108103613be0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c4957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c8857600080fd5b83018035915067ffffffffffffffff821115613ca357600080fd5b60200191503681900382131561382357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ced57600080fd5b830160208101925035905067ffffffffffffffff811115613d0d57600080fd5b80360382131561382357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561370f578135613d888161351a565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d75565b602081528135602082015260006020830135613dd58161347f565b67ffffffffffffffff8082166040850152613df36040860186613cb8565b925060a06060860152613e0a60c086018483613d1c565b925050613e1a6060860186613cb8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e50858385613d1c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e8957600080fd5b60209288019283019235915083821115613ea257600080fd5b8160061b3603831315613eb457600080fd5b8685030160a0870152613286848284613d65565b601f821115611711576000816000526020600020601f850160051c81016020861015613ef15750805b601f850160051c820191505b81811015611fb357828155600101613efd565b67ffffffffffffffff831115613f2857613f28613941565b613f3c83613f368354613b93565b83613ec8565b6000601f841160018114613f8e5760008515613f585750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611506565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fdd5786850135825560209485019460019092019101613fbd565b5086821015614018577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356140648161351a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140ca576140ca613941565b8054838255808410156141575760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410b5761410b61402a565b808616861461411c5761411c61402a565b5060008360005260206000208360011b81018760011b820191505b80821015614152578282558284830155600282019150614137565b505050505b5060008181526020812083915b85811015611fb3576141768383614059565b6040929092019160029190910190600101614164565b813581556001810160208301356141a28161347f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141e26040860186613c53565b935091506141f4838360028701613f10565b6142016060860186613c53565b93509150614213838360038701613f10565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424a57600080fd5b91840191823591508082111561425f57600080fd5b506020820191508060061b360382131561427857600080fd5b612aee8183600486016140b1565b815167ffffffffffffffff8111156142a0576142a0613941565b6142b4816142ae8454613b93565b84613ec8565b602080601f83116001811461430757600084156142d15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611fb3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561435457888601518255948401946001909101908401614335565b508582101561439057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c4957600080fd5b602081526000612dd1602083018486613d1c565b60008251613c49818460208701613584565b80820180821115610aab57610aab61402a565b67ffffffffffffffff83168152604060208201526000825160a0604084015261443960e08401826135a8565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261447583836135a8565b9250604086015191508085840301608086015261449283836136bd565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144d082826135a8565b9695505050505050565b6000602082840312156144ec57600080fd5b5051919050565b60006020828403121561450557600080fd5b8151612c0d8161355956fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bbf38038062004bbf83398101604081905262000034916200056d565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000149565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013d576200013d6001600160a01b03821683600019620001f4565b50505050505062000692565b336001600160a01b03821603620001a35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c9190620005ac565b620002789190620005c6565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d491869190620002da16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000329906001600160a01b038516908490620003b0565b805190915015620003ab57808060200190518101906200034a9190620005ee565b620003ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003c18484600085620003c9565b949350505050565b6060824710156200042c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b031685876040516200044a91906200063f565b60006040518083038185875af1925050503d806000811462000489576040519150601f19603f3d011682016040523d82523d6000602084013e6200048e565b606091505b509092509050620004a287838387620004ad565b979650505050505050565b606083156200052157825160000362000519576001600160a01b0385163b620005195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003c1565b620003c18383815115620005385781518083602001fd5b8060405162461bcd60e51b81526004016200008891906200065d565b6001600160a01b03811681146200056a57600080fd5b50565b600080604083850312156200058157600080fd5b82516200058e8162000554565b6020840151909250620005a18162000554565b809150509250929050565b600060208284031215620005bf57600080fd5b5051919050565b80820180821115620005e857634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060157600080fd5b815180151581146200061257600080fd5b9392505050565b60005b83811015620006365781810151838201526020016200061c565b50506000910152565b600082516200065381846020870162000619565b9190910192915050565b60208152600082518060208401526200067e81604085016020870162000619565b601f01601f19169190910160400192915050565b61451d80620006a26000396000f3fe6080604052600436106101dc5760003560e01c80638462a2b911610102578063bee518a411610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063bee518a4146105d1578063c851cc32146105fa578063c89245d51461061a578063cf6730f81461063a57600080fd5b80639fe74e26116100d15780639fe74e261461052e578063b0f479a11461054e578063b187bd2614610579578063b5a11011146105b157600080fd5b80638462a2b9146104a357806385572ffb146104c35780638da5cb5b146104e35780639d2aede51461050e57600080fd5b806335f170ef1161017a5780636939cd97116101495780636939cd97146103f85780636d62d633146104255780636fef519e1461044557806379ba50971461048e57600080fd5b806335f170ef1461035c5780635075a9d41461038a578063536c6bfa146103b85780635e35359e146103d857600080fd5b8063181f5a77116101b6578063181f5a77146102805780631892b906146102cf5780632874d8bf146102ef5780632b6e5d631461030457600080fd5b806305bfe982146101e85780630e958d6b1461022e57806316c38b3c1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004613425565b60096020526000908152604090205460ff1681565b604051610225919061343e565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613495565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e610279366004613528565b610725565b005b34801561028c57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906135b3565b3480156102db57600080fd5b5061027e6102ea3660046135c6565b61077f565b3480156102fb57600080fd5b5061027e6107c2565b34801561031057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561036857600080fd5b5061037c6103773660046135c6565b6107fe565b6040516102259291906135e3565b34801561039657600080fd5b506103aa6103a5366004613425565b61092a565b604051908152602001610225565b3480156103c457600080fd5b5061027e6103d3366004613633565b61093d565b3480156103e457600080fd5b5061027e6103f336600461365f565b6109a1565b34801561040457600080fd5b50610418610413366004613425565b610a36565b60405161022591906136fd565b34801561043157600080fd5b5061027e610440366004613791565b610c41565b34801561045157600080fd5b506102c26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561049a57600080fd5b5061027e610f5b565b3480156104af57600080fd5b5061027e6104be36600461380d565b611058565b3480156104cf57600080fd5b5061027e6104de366004613879565b611399565b3480156104ef57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610337565b34801561051a57600080fd5b5061027e6105293660046138b4565b6115a2565b34801561053a57600080fd5b5061027e6105493660046138d1565b61165d565b34801561055a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610337565b34801561058557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105bd57600080fd5b5061027e6105cc366004613913565b6119ee565b3480156105dd57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561060657600080fd5b5061027e6106153660046138b4565b611b5e565b34801561062657600080fd5b5061027e6106353660046138b4565b611c2a565b34801561064657600080fd5b5061027e610655366004613879565b611d9e565b34801561066657600080fd5b5061027e610675366004613425565b611fbb565b6103aa610688366004613a76565b612225565b34801561069957600080fd5b5061027e6106a83660046138b4565b61275b565b3480156106b957600080fd5b506008546103379073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613b83565b9081526040519081900360200190205460ff1690509392505050565b61072d61276f565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b61078761276f565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6107ca61276f565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556107fc60016127f0565b565b60036020526000908152604090208054819061081990613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613b93565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050908060010180546108a790613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546108d390613b93565b80156109205780601f106108f557610100808354040283529160200191610920565b820191906000526020600020905b81548152906001019060200180831161090357829003601f168201915b5050505050905082565b60006109376005836128fd565b92915050565b61094561276f565b61094f8282612910565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109a961276f565b6109ca73ffffffffffffffffffffffffffffffffffffffff84168383612a6a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a2991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610aa590613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad190613b93565b8015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b50505050508152602001600382018054610b3790613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613b93565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c335760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610bde565b505050915250909392505050565b610c4961276f565b6001610c566005846128fd565b14610c95576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ca58260025b60059190612b3e565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610ced90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1990613b93565b8015610d665780601f10610d3b57610100808354040283529160200191610d66565b820191906000526020600020905b815481529060010190602001808311610d4957829003601f168201915b50505050508152602001600382018054610d7f90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab90613b93565b8015610df85780601f10610dcd57610100808354040283529160200191610df8565b820191906000526020600020905b815481529060010190602001808311610ddb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e7b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e26565b5050505081525050905060005b816080015151811015610f0a57610f028383608001518381518110610eaf57610eaf613be6565b60200260200101516020015184608001518481518110610ed157610ed1613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a6a9092919063ffffffff16565b600101610e88565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c8c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61106061276f565b60005b818110156111f3576003600084848481811061108157611081613be6565b90506020028101906110939190613c15565b6110a19060208101906135c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110d8576110d8613be6565b90506020028101906110ea9190613c15565b6110f8906020810190613c53565b604051611106929190613b83565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061114d5761114d613be6565b905060200281019061115f9190613c15565b61116d906020810190613c53565b60405161117b929190613b83565b604051809103902083838381811061119557611195613be6565b90506020028101906111a79190613c15565b6111b59060208101906135c6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611063565b5060005b838110156113925760016003600087878581811061121757611217613be6565b90506020028101906112299190613c15565b6112379060208101906135c6565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061126e5761126e613be6565b90506020028101906112809190613c15565b61128e906020810190613c53565b60405161129c929190613b83565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106112ec576112ec613be6565b90506020028101906112fe9190613c15565b61130c906020810190613c53565b60405161131a929190613b83565b604051809103902085858381811061133457611334613be6565b90506020028101906113469190613c15565b6113549060208101906135c6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016111f7565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113ec576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c8c565b6113fc60408201602083016135c6565b67ffffffffffffffff811660009081526003602052604090208054819061142290613b93565b9050600003611469576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c8c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114a5908690600401613dba565b600060405180830381600087803b1580156114bf57600080fd5b505af19250505080156114d0575060015b611570573d8080156114fe576040519150601f19603f3d011682016040523d82523d6000602084013e611503565b606091505b5061151084356001610c9c565b5083356000908152600460205260409020849061152d828261418c565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906115629084906135b3565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6115aa61276f565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906116599082614286565b5050565b61166561276f565b60005b8181101561159d5782828281811061168257611682613be6565b905060200281019061169491906143a0565b6116a5906040810190602001613528565b61177157600360008484848181106116bf576116bf613be6565b90506020028101906116d191906143a0565b6116df9060208101906135c6565b67ffffffffffffffff16815260208101919091526040016000908120611704916133d7565b82828281811061171657611716613be6565b905060200281019061172891906143a0565b6117369060208101906135c6565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26119e6565b82828281811061178357611783613be6565b905060200281019061179591906143a0565b6117a3906040810190613c53565b90506000036117de576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106117f6576117f6613be6565b905060200281019061180891906143a0565b6118169060208101906135c6565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061184c5761184c613be6565b905060200281019061185e91906143a0565b61186c906040810190613c53565b8291611879919083613f10565b5083838381811061188c5761188c613be6565b905060200281019061189e91906143a0565b6118ac906060810190613c53565b1590506118f7578383838181106118c5576118c5613be6565b90506020028101906118d791906143a0565b6118e5906060810190613c53565b60018301916118f5919083613f10565b505b83838381811061190957611909613be6565b905060200281019061191b91906143a0565b611929906040810190613c53565b604051611937929190613b83565b604051809103902084848481811061195157611951613be6565b905060200281019061196391906143a0565b6119719060208101906135c6565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106119ae576119ae613be6565b90506020028101906119c091906143a0565b6119ce906060810190613c53565b6040516119dc9291906143d4565b60405180910390a3505b600101611668565b6119f661276f565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611ab1916143e8565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061159d9082614286565b611b6661276f565b73ffffffffffffffffffffffffffffffffffffffff8116611bb3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611c3261276f565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c9357611c93611c7260025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b53565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611d4057611d40611d0060025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612cd5565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611dd7576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611de760408201602083016135c6565b611df46040830183613c53565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611e4b92509050613b93565b15905080611ea15750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e8c91906143e8565b9081526040519081900360200190205460ff16155b15611eda57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c8c91906135b3565b611eea60408401602085016135c6565b67ffffffffffffffff8116600090815260036020526040902080548190611f1090613b93565b9050600003611f57576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c8c565b6000611f666060870187613c53565b810190611f739190613425565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611fb357611fb3611fae8260016143fa565b6127f0565b505050505050565b6001611fc86005836128fd565b14612002576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c8c565b61200d816000610c9c565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161205590613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461208190613b93565b80156120ce5780601f106120a3576101008083540402835291602001916120ce565b820191906000526020600020905b8154815290600101906020018083116120b157829003601f168201915b505050505081526020016003820180546120e790613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461211390613b93565b80156121605780601f1061213557610100808354040283529160200191612160565b820191906000526020600020905b81548152906001019060200180831161214357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156121e35760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161218e565b505050508152505090506121f681612dd9565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061224e90613b93565b9050600003612295576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c8c565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906122c590613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546122f190613b93565b801561233e5780601f106123135761010080835404028352916020019161233e565b820191906000526020600020905b81548152906001019060200180831161232157829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161239f90613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546123cb90613b93565b80156124185780601f106123ed57610100808354040283529160200191612418565b820191906000526020600020905b8154815290600101906020018083116123fb57829003601f168201915b5050505050815250905060005b865181101561257557612495333089848151811061244557612445613be6565b6020026020010151602001518a858151811061246357612463613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e4b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106124c5576124c5613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461256d57600254875161256d9173ffffffffffffffffffffffffffffffffffffffff169089908490811061251e5761251e613be6565b60200260200101516020015189848151811061253c5761253c613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b539092919063ffffffff16565b600101612425565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906125cf908b90869060040161440d565b602060405180830381865afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261091906144da565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612656576008546126569073ffffffffffffffffffffffffffffffffffffffff16333084612e4b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561268857600061268a565b825b8a856040518463ffffffff1660e01b81526004016126a992919061440d565b60206040518083038185885af11580156126c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126ec91906144da565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61276361276f565b61276c81612ea9565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c8c565b80600116600103612833576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612867565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161287c91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a5460008085526020850190935290935061159d9267ffffffffffffffff909116916128f6565b60408051808201909152600080825260208201528152602001906001900390816128cf5790505b5083612225565b60006129098383612f9e565b9392505050565b8047101561297a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c8c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b505090508061159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c8c565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261159d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613028565b6000612b4b848484613134565b949350505050565b801580612bf357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf191906144da565b155b612c7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c8c565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261159d9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612abc565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7091906144da565b612d7a91906143fa565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612dd39085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612abc565b50505050565b612de161276f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e1d9084906004016136fd565b600060405180830381600087803b158015612e3757600080fd5b505af1158015611392573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612dd39085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612abc565b3373ffffffffffffffffffffffffffffffffffffffff821603612f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c8c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612fc25750612fc28484613151565b612909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c8c565b600061308a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661315d9092919063ffffffff16565b80519091501561159d57808060200190518101906130a891906144f3565b61159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c8c565b60008281526002840160205260408120829055612b4b848461316c565b60006129098383613178565b6060612b4b8484600085613190565b600061290983836132a9565b60008181526001830160205260408120541515612909565b606082471015613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c8c565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161324b91906143e8565b60006040518083038185875af1925050503d8060008114613288576040519150601f19603f3d011682016040523d82523d6000602084013e61328d565b606091505b509150915061329e878383876132f8565b979650505050505050565b60008181526001830160205260408120546132f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610937565b506000610937565b6060831561338e5782516000036133875773ffffffffffffffffffffffffffffffffffffffff85163b613387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c8c565b5081612b4b565b612b4b83838151156133a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c91906135b3565b5080546133e390613b93565b6000825580601f106133f3575050565b601f01602090049060005260206000209081019061276c91905b80821115613421576000815560010161340d565b5090565b60006020828403121561343757600080fd5b5035919050565b6020810160038310613479577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461276c57600080fd5b6000806000604084860312156134aa57600080fd5b83356134b58161347f565b9250602084013567ffffffffffffffff808211156134d257600080fd5b818601915086601f8301126134e657600080fd5b8135818111156134f557600080fd5b87602082850101111561350757600080fd5b6020830194508093505050509250925092565b801515811461276c57600080fd5b60006020828403121561353a57600080fd5b81356129098161351a565b60005b83811015613560578181015183820152602001613548565b50506000910152565b60008151808452613581816020860160208601613545565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129096020830184613569565b6000602082840312156135d857600080fd5b81356129098161347f565b6040815260006135f66040830185613569565b82810360208401526136088185613569565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461276c57600080fd5b6000806040838503121561364657600080fd5b823561365181613611565b946020939093013593505050565b60008060006060848603121561367457600080fd5b833561367f81613611565b9250602084013561368f81613611565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261373760c0840182613569565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137738383613569565b925060808601519150808584030160a08601525061360882826136a0565b600080604083850312156137a457600080fd5b8235915060208301356137b681613611565b809150509250929050565b60008083601f8401126137d357600080fd5b50813567ffffffffffffffff8111156137eb57600080fd5b6020830191508360208260051b850101111561380657600080fd5b9250929050565b6000806000806040858703121561382357600080fd5b843567ffffffffffffffff8082111561383b57600080fd5b613847888389016137c1565b9096509450602087013591508082111561386057600080fd5b5061386d878288016137c1565b95989497509550505050565b60006020828403121561388b57600080fd5b813567ffffffffffffffff8111156138a257600080fd5b820160a0818503121561290957600080fd5b6000602082840312156138c657600080fd5b813561290981613611565b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b613907858286016137c1565b90969095509350505050565b6000806040838503121561392657600080fd5b82356139318161347f565b915060208301356137b681613611565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561399357613993613941565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e0576139e0613941565b604052919050565b600082601f8301126139f957600080fd5b813567ffffffffffffffff811115613a1357613a13613941565b613a4460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613999565b818152846020838601011115613a5957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8b57600080fd5b8335613a968161347f565b925060208481013567ffffffffffffffff80821115613ab457600080fd5b818701915087601f830112613ac857600080fd5b813581811115613ada57613ada613941565b613ae8848260051b01613999565b81815260069190911b8301840190848101908a831115613b0757600080fd5b938501935b82851015613b53576040858c031215613b255760008081fd5b613b2d613970565b8535613b3881613611565b81528587013587820152825260409094019390850190613b0c565b965050506040870135925080831115613b6b57600080fd5b5050613b79868287016139e8565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613ba757607f821691505b602082108103613be0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c4957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c8857600080fd5b83018035915067ffffffffffffffff821115613ca357600080fd5b60200191503681900382131561380657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ced57600080fd5b830160208101925035905067ffffffffffffffff811115613d0d57600080fd5b80360382131561380657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136f2578135613d8881613611565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d75565b602081528135602082015260006020830135613dd58161347f565b67ffffffffffffffff8082166040850152613df36040860186613cb8565b925060a06060860152613e0a60c086018483613d1c565b925050613e1a6060860186613cb8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e50858385613d1c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e8957600080fd5b60209288019283019235915083821115613ea257600080fd5b8160061b3603831315613eb457600080fd5b8685030160a087015261329e848284613d65565b601f82111561159d576000816000526020600020601f850160051c81016020861015613ef15750805b601f850160051c820191505b81811015611fb357828155600101613efd565b67ffffffffffffffff831115613f2857613f28613941565b613f3c83613f368354613b93565b83613ec8565b6000601f841160018114613f8e5760008515613f585750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611392565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fdd5786850135825560209485019460019092019101613fbd565b5086821015614018577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561406481613611565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140ca576140ca613941565b8054838255808410156141575760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410b5761410b61402a565b808616861461411c5761411c61402a565b5060008360005260206000208360011b81018760011b820191505b80821015614152578282558284830155600282019150614137565b505050505b5060008181526020812083915b85811015611fb3576141768383614059565b6040929092019160029190910190600101614164565b813581556001810160208301356141a28161347f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141e26040860186613c53565b935091506141f4838360028701613f10565b6142016060860186613c53565b93509150614213838360038701613f10565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424a57600080fd5b91840191823591508082111561425f57600080fd5b506020820191508060061b360382131561427857600080fd5b612dd38183600486016140b1565b815167ffffffffffffffff8111156142a0576142a0613941565b6142b4816142ae8454613b93565b84613ec8565b602080601f83116001811461430757600084156142d15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611fb3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561435457888601518255948401946001909101908401614335565b508582101561439057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c4957600080fd5b602081526000612b4b602083018486613d1c565b60008251613c49818460208701613545565b808201808211156109375761093761402a565b67ffffffffffffffff83168152604060208201526000825160a0604084015261443960e0840182613569565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144758383613569565b9250604086015191508085840301608086015261449283836136a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144d08282613569565b9695505050505050565b6000602082840312156144ec57600080fd5b5051919050565b60006020828403121561450557600080fd5b81516129098161351a56fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -550,18 +550,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) CcipSend(destChainSelector u return _PingPongDemo.Contract.CcipSend(&_PingPongDemo.TransactOpts, destChainSelector, tokenAmounts, data) } -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) } @@ -670,6 +658,18 @@ func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds [ return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) } +func (_PingPongDemo *PingPongDemoTransactor) UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateFeeToken", token) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateFeeToken(&_PingPongDemo.TransactOpts, token) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateFeeToken(&_PingPongDemo.TransactOpts, token) +} + func (_PingPongDemo *PingPongDemoTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "updateRouter", newRouter) } @@ -1390,8 +1390,8 @@ func (_PingPongDemo *PingPongDemoFilterer) ParseChainRemoved(log types.Log) (*Pi return event, nil } -type PingPongDemoFeeTokenModifiedIterator struct { - Event *PingPongDemoFeeTokenModified +type PingPongDemoFeeTokenUpdatedIterator struct { + Event *PingPongDemoFeeTokenUpdated contract *bind.BoundContract event string @@ -1402,7 +1402,7 @@ type PingPongDemoFeeTokenModifiedIterator struct { fail error } -func (it *PingPongDemoFeeTokenModifiedIterator) Next() bool { +func (it *PingPongDemoFeeTokenUpdatedIterator) Next() bool { if it.fail != nil { return false @@ -1411,7 +1411,7 @@ func (it *PingPongDemoFeeTokenModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoFeeTokenModified) + it.Event = new(PingPongDemoFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1426,7 +1426,7 @@ func (it *PingPongDemoFeeTokenModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoFeeTokenModified) + it.Event = new(PingPongDemoFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1441,22 +1441,22 @@ func (it *PingPongDemoFeeTokenModifiedIterator) Next() bool { } } -func (it *PingPongDemoFeeTokenModifiedIterator) Error() error { +func (it *PingPongDemoFeeTokenUpdatedIterator) Error() error { return it.fail } -func (it *PingPongDemoFeeTokenModifiedIterator) Close() error { +func (it *PingPongDemoFeeTokenUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoFeeTokenModified struct { +type PingPongDemoFeeTokenUpdated struct { OldToken common.Address NewToken common.Address Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenModifiedIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenUpdatedIterator, error) { var oldTokenRule []interface{} for _, oldTokenItem := range oldToken { @@ -1467,14 +1467,14 @@ func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenModified(opts *bind.Fil newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) if err != nil { return nil, err } - return &PingPongDemoFeeTokenModifiedIterator{contract: _PingPongDemo.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil + return &PingPongDemoFeeTokenUpdatedIterator{contract: _PingPongDemo.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { var oldTokenRule []interface{} for _, oldTokenItem := range oldToken { @@ -1485,7 +1485,7 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenModified(opts *bind.Watc newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) if err != nil { return nil, err } @@ -1495,8 +1495,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenModified(opts *bind.Watc select { case log := <-logs: - event := new(PingPongDemoFeeTokenModified) - if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + event := new(PingPongDemoFeeTokenUpdated) + if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return err } event.Raw = log @@ -1517,9 +1517,9 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenModified(opts *bind.Watc }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParseFeeTokenModified(log types.Log) (*PingPongDemoFeeTokenModified, error) { - event := new(PingPongDemoFeeTokenModified) - if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseFeeTokenUpdated(log types.Log) (*PingPongDemoFeeTokenUpdated, error) { + event := new(PingPongDemoFeeTokenUpdated) + if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return nil, err } event.Raw = log @@ -3066,8 +3066,8 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, return _PingPongDemo.ParseChainAdded(log) case _PingPongDemo.abi.Events["ChainRemoved"].ID: return _PingPongDemo.ParseChainRemoved(log) - case _PingPongDemo.abi.Events["FeeTokenModified"].ID: - return _PingPongDemo.ParseFeeTokenModified(log) + case _PingPongDemo.abi.Events["FeeTokenUpdated"].ID: + return _PingPongDemo.ParseFeeTokenUpdated(log) case _PingPongDemo.abi.Events["MessageAbandoned"].ID: return _PingPongDemo.ParseMessageAbandoned(log) case _PingPongDemo.abi.Events["MessageAckReceived"].ID: @@ -3118,8 +3118,8 @@ func (PingPongDemoChainRemoved) Topic() common.Hash { return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") } -func (PingPongDemoFeeTokenModified) Topic() common.Hash { - return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") +func (PingPongDemoFeeTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67") } func (PingPongDemoMessageAbandoned) Topic() common.Hash { @@ -3213,8 +3213,6 @@ type PingPongDemoInterface interface { CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []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) @@ -3233,6 +3231,8 @@ type PingPongDemoInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -3271,11 +3271,11 @@ type PingPongDemoInterface interface { ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, error) - FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenModifiedIterator, error) + FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenUpdatedIterator, error) - WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) - ParseFeeTokenModified(log types.Log) (*PingPongDemoFeeTokenModified, error) + ParseFeeTokenUpdated(log types.Log) (*PingPongDemoFeeTokenUpdated, error) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*PingPongDemoMessageAbandonedIterator, 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 a27035de08..22998c3262 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"fundPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCountIncrBeforeFunding\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"modifyFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620051393803806200513983398101604081905262000034916200059b565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000177565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b0382168360001962000222565b5050505050508060026200015491906200060a565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070a565b336001600160a01b03821603620001d15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029a919062000630565b620002a691906200064a565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000302918691906200030816565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000357906001600160a01b038516908490620003de565b805190915015620003d9578080602001905181019062000378919062000666565b620003d95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003ef8484600085620003f7565b949350505050565b6060824710156200045a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004789190620006b7565b60006040518083038185875af1925050503d8060008114620004b7576040519150601f19603f3d011682016040523d82523d6000602084013e620004bc565b606091505b509092509050620004d087838387620004db565b979650505050505050565b606083156200054f57825160000362000547576001600160a01b0385163b620005475760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003ef565b620003ef8383815115620005665781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006d5565b6001600160a01b03811681146200059857600080fd5b50565b600080600060608486031215620005b157600080fd5b8351620005be8162000582565b6020850151909350620005d18162000582565b604085015190925060ff81168114620005e957600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff8181168382160290811690818114620006295762000629620005f4565b5092915050565b6000602082840312156200064357600080fd5b5051919050565b80820180821115620006605762000660620005f4565b92915050565b6000602082840312156200067957600080fd5b815180151581146200068a57600080fd5b9392505050565b60005b83811015620006ae57818101518382015260200162000694565b50506000910152565b60008251620006cb81846020870162000691565b9190910192915050565b6020815260008251806020840152620006f681604085016020870162000691565b601f01601f19169190910160400192915050565b614a1f806200071a6000396000f3fe60806040526004361061021d5760003560e01c806385572ffb1161011d578063bee518a4116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063bee518a414610659578063c851cc3214610682578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b80639fe74e26116100ec5780639fe74e26146105b6578063b0f479a1146105d6578063b187bd2614610601578063b5a110111461063957600080fd5b806385572ffb1461052b5780638da5cb5b1461054b5780638f491cba146105765780639d2aede51461059657600080fd5b806335f170ef116101b05780636939cd971161017f5780636fef519e116101645780636fef519e146104ad57806379ba5097146104f65780638462a2b91461050b57600080fd5b80636939cd97146104605780636d62d6331461048d57600080fd5b806335f170ef146103c45780635075a9d4146103f2578063536c6bfa146104205780635e35359e1461044057600080fd5b8063181f5a77116101ec578063181f5a77146102e15780631892b906146103375780632874d8bf146103575780632b6e5d631461036c57600080fd5b806305bfe982146102295780630e958d6b1461026f57806311e85dff1461029f57806316c38b3c146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b506102596102443660046138ac565b60096020526000908152604090205460ff1681565b60405161026691906138c5565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461391c565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba3660046139c3565b6107f3565b005b3480156102cd57600080fd5b506102bf6102dc3660046139ee565b610967565b3480156102ed57600080fd5b5061032a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613a79565b34801561034357600080fd5b506102bf610352366004613a8c565b6109c1565b34801561036357600080fd5b506102bf610a04565b34801561037857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103d057600080fd5b506103e46103df366004613a8c565b610a40565b604051610266929190613aa9565b3480156103fe57600080fd5b5061041261040d3660046138ac565b610b6c565b604051908152602001610266565b34801561042c57600080fd5b506102bf61043b366004613ad7565b610b7f565b34801561044c57600080fd5b506102bf61045b366004613b03565b610be3565b34801561046c57600080fd5b5061048061047b3660046138ac565b610c78565b6040516102669190613ba1565b34801561049957600080fd5b506102bf6104a8366004613c35565b610e83565b3480156104b957600080fd5b5061032a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561050257600080fd5b506102bf61119d565b34801561051757600080fd5b506102bf610526366004613cb1565b61129a565b34801561053757600080fd5b506102bf610546366004613d1d565b6115db565b34801561055757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561058257600080fd5b506102bf6105913660046138ac565b6117e4565b3480156105a257600080fd5b506102bf6105b13660046139c3565b6119c0565b3480156105c257600080fd5b506102bf6105d1366004613d58565b611a7b565b3480156105e257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661039f565b34801561060d57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561064557600080fd5b506102bf610654366004613d9a565b611e0c565b34801561066557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b34801561068e57600080fd5b506102bf61069d3660046139c3565b611f7c565b3480156106ae57600080fd5b506102bf6106bd366004613d1d565b612048565b3480156106ce57600080fd5b506102bf6106dd3660046138ac565b612265565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b610412610736366004613efd565b6124cf565b34801561074757600080fd5b506102bf61075636600461400a565b612a05565b34801561076757600080fd5b506102bf6107763660046139c3565b612a96565b34801561078757600080fd5b5060085461039f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d7908590859061402d565b9081526040519081900360200190205460ff1690509392505050565b6107fb612aa7565b60085473ffffffffffffffffffffffffffffffffffffffff161561085c5761085c61083b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b28565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015610909576109096108c960025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612d28565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e60405160405180910390a35050565b61096f612aa7565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109c9612aa7565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610a0c612aa7565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055610a3e6001612e2c565b565b600360205260009081526040902080548190610a5b9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a879061403d565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b505050505090806001018054610ae99061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b159061403d565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905082565b6000610b79600583613088565b92915050565b610b87612aa7565b610b91828261309b565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610beb612aa7565b610c0c73ffffffffffffffffffffffffffffffffffffffff841683836131f5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610c6b91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ce79061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d139061403d565b8015610d605780601f10610d3557610100808354040283529160200191610d60565b820191906000526020600020905b815481529060010190602001808311610d4357829003601f168201915b50505050508152602001600382018054610d799061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610da59061403d565b8015610df25780601f10610dc757610100808354040283529160200191610df2565b820191906000526020600020905b815481529060010190602001808311610dd557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e755760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e20565b505050915250909392505050565b610e8b612aa7565b6001610e98600584613088565b14610ed7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ee78260025b6005919061324b565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610f2f9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5b9061403d565b8015610fa85780601f10610f7d57610100808354040283529160200191610fa8565b820191906000526020600020905b815481529060010190602001808311610f8b57829003601f168201915b50505050508152602001600382018054610fc19061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fed9061403d565b801561103a5780601f1061100f5761010080835404028352916020019161103a565b820191906000526020600020905b81548152906001019060200180831161101d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611068565b5050505081525050905060005b81608001515181101561114c5761114483836080015183815181106110f1576110f1614090565b6020026020010151602001518460800151848151811061111357611113614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166131f59092919063ffffffff16565b6001016110ca565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ece565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112a2612aa7565b60005b8181101561143557600360008484848181106112c3576112c3614090565b90506020028101906112d591906140bf565b6112e3906020810190613a8c565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061131a5761131a614090565b905060200281019061132c91906140bf565b61133a9060208101906140fd565b60405161134892919061402d565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061138f5761138f614090565b90506020028101906113a191906140bf565b6113af9060208101906140fd565b6040516113bd92919061402d565b60405180910390208383838181106113d7576113d7614090565b90506020028101906113e991906140bf565b6113f7906020810190613a8c565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016112a5565b5060005b838110156115d45760016003600087878581811061145957611459614090565b905060200281019061146b91906140bf565b611479906020810190613a8c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106114b0576114b0614090565b90506020028101906114c291906140bf565b6114d09060208101906140fd565b6040516114de92919061402d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061152e5761152e614090565b905060200281019061154091906140bf565b61154e9060208101906140fd565b60405161155c92919061402d565b604051809103902085858381811061157657611576614090565b905060200281019061158891906140bf565b611596906020810190613a8c565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611439565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461162e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ece565b61163e6040820160208301613a8c565b67ffffffffffffffff81166000908152600360205260409020805481906116649061403d565b90506000036116ab576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ece565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906116e7908690600401614264565b600060405180830381600087803b15801561170157600080fd5b505af1925050508015611712575060015b6117b2573d808015611740576040519150601f19603f3d011682016040523d82523d6000602084013e611745565b606091505b5061175284356001610ede565b5083356000908152600460205260409020849061176f8282614636565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906117a4908490613a79565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff16158061183c5750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156118445750565b600a54600190611878907d010000000000000000000000000000000000000000000000000000000000900460ff1683614730565b116119bd5760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611910573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611934919061476b565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561197b57600080fd5b505af115801561198f573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6119c8612aa7565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff16600090815260036020522090611a779082614788565b5050565b611a83612aa7565b60005b818110156117df57828282818110611aa057611aa0614090565b9050602002810190611ab291906148a2565b611ac39060408101906020016139ee565b611b8f5760036000848484818110611add57611add614090565b9050602002810190611aef91906148a2565b611afd906020810190613a8c565b67ffffffffffffffff16815260208101919091526040016000908120611b229161385e565b828282818110611b3457611b34614090565b9050602002810190611b4691906148a2565b611b54906020810190613a8c565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611e04565b828282818110611ba157611ba1614090565b9050602002810190611bb391906148a2565b611bc19060408101906140fd565b9050600003611bfc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611c1457611c14614090565b9050602002810190611c2691906148a2565b611c34906020810190613a8c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611c6a57611c6a614090565b9050602002810190611c7c91906148a2565b611c8a9060408101906140fd565b8291611c979190836143ba565b50838383818110611caa57611caa614090565b9050602002810190611cbc91906148a2565b611cca9060608101906140fd565b159050611d1557838383818110611ce357611ce3614090565b9050602002810190611cf591906148a2565b611d039060608101906140fd565b6001830191611d139190836143ba565b505b838383818110611d2757611d27614090565b9050602002810190611d3991906148a2565b611d479060408101906140fd565b604051611d5592919061402d565b6040518091039020848484818110611d6f57611d6f614090565b9050602002810190611d8191906148a2565b611d8f906020810190613a8c565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611dcc57611dcc614090565b9050602002810190611dde91906148a2565b611dec9060608101906140fd565b604051611dfa9291906148d6565b60405180910390a3505b600101611a86565b611e14612aa7565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611ecf916148ea565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906117df9082614788565b611f84612aa7565b73ffffffffffffffffffffffffffffffffffffffff8116611fd1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b333014612081576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120916040820160208301613a8c565b61209e60408301836140fd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506120f59250905061403d565b1590508061214b5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161213691906148ea565b9081526040519081900360200190205460ff16155b1561218457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ece9190613a79565b6121946040840160208501613a8c565b67ffffffffffffffff81166000908152600360205260409020805481906121ba9061403d565b9050600003612201576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ece565b600061221060608701876140fd565b81019061221d91906138ac565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff1661225d5761225d6122588260016148fc565b612e2c565b505050505050565b6001612272600583613088565b146122ac576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ece565b6122b7816000610ede565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916122ff9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461232b9061403d565b80156123785780601f1061234d57610100808354040283529160200191612378565b820191906000526020600020905b81548152906001019060200180831161235b57829003601f168201915b505050505081526020016003820180546123919061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd9061403d565b801561240a5780601f106123df5761010080835404028352916020019161240a565b820191906000526020600020905b8154815290600101906020018083116123ed57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561248d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612438565b505050508152505090506124a081613260565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906124f89061403d565b905060000361253f576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ece565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061256f9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461259b9061403d565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916126499061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546126759061403d565b80156126c25780601f10612697576101008083540402835291602001916126c2565b820191906000526020600020905b8154815290600101906020018083116126a557829003601f168201915b5050505050815250905060005b865181101561281f5761273f33308984815181106126ef576126ef614090565b6020026020010151602001518a858151811061270d5761270d614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132d2909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061276f5761276f614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146128175760025487516128179173ffffffffffffffffffffffffffffffffffffffff16908990849081106127c8576127c8614090565b6020026020010151602001518984815181106127e6576127e6614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b289092919063ffffffff16565b6001016126cf565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612879908b90869060040161490f565b602060405180830381865afa158015612896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ba91906149dc565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612900576008546129009073ffffffffffffffffffffffffffffffffffffffff163330846132d2565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612932576000612934565b825b8a856040518463ffffffff1660e01b815260040161295392919061490f565b60206040518083038185885af1158015612971573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061299691906149dc565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612a0d612aa7565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a9e612aa7565b6119bd81613330565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ece565b801580612bc857506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc691906149dc565b155b612c54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ece565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117df9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613425565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc391906149dc565b612dcd91906148fc565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612e269085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612ca6565b50505050565b80600116600103612e6f576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612ea3565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612eac816117e4565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612f1091815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612f8a57816020015b6040805180820190915260008082526020820152815260200190600190039081612f635790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612fe160025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f9916130459167ffffffffffffffff90911690859060040161490f565b6020604051808303816000875af1158015613064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df91906149dc565b60006130948383613531565b9392505050565b80471015613105576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ece565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461315f576040519150601f19603f3d011682016040523d82523d6000602084013e613164565b606091505b50509050806117df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ece565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117df9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612ca6565b60006132588484846135bb565b949350505050565b613268612aa7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906132a4908490600401613ba1565b600060405180830381600087803b1580156132be57600080fd5b505af11580156115d4573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e269085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ca6565b3373ffffffffffffffffffffffffffffffffffffffff8216036133af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ece565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613487826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135d89092919063ffffffff16565b8051909150156117df57808060200190518101906134a591906149f5565b6117df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ece565b600081815260028301602052604081205480151580613555575061355584846135e7565b613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610ece565b6000828152600284016020526040812082905561325884846135f3565b606061325884846000856135ff565b60006130948383613718565b60006130948383613730565b606082471015613691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ece565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136ba91906148ea565b60006040518083038185875af1925050503d80600081146136f7576040519150601f19603f3d011682016040523d82523d6000602084013e6136fc565b606091505b509150915061370d8783838761377f565b979650505050505050565b60008181526001830160205260408120541515613094565b600081815260018301602052604081205461377757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b79565b506000610b79565b6060831561381557825160000361380e5773ffffffffffffffffffffffffffffffffffffffff85163b61380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ece565b5081613258565b613258838381511561382a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece9190613a79565b50805461386a9061403d565b6000825580601f1061387a575050565b601f0160209004906000526020600020908101906119bd91905b808211156138a85760008155600101613894565b5090565b6000602082840312156138be57600080fd5b5035919050565b6020810160038310613900577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146119bd57600080fd5b60008060006040848603121561393157600080fd5b833561393c81613906565b9250602084013567ffffffffffffffff8082111561395957600080fd5b818601915086601f83011261396d57600080fd5b81358181111561397c57600080fd5b87602082850101111561398e57600080fd5b6020830194508093505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b6000602082840312156139d557600080fd5b8135613094816139a1565b80151581146119bd57600080fd5b600060208284031215613a0057600080fd5b8135613094816139e0565b60005b83811015613a26578181015183820152602001613a0e565b50506000910152565b60008151808452613a47816020860160208601613a0b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006130946020830184613a2f565b600060208284031215613a9e57600080fd5b813561309481613906565b604081526000613abc6040830185613a2f565b8281036020840152613ace8185613a2f565b95945050505050565b60008060408385031215613aea57600080fd5b8235613af5816139a1565b946020939093013593505050565b600080600060608486031215613b1857600080fd5b8335613b23816139a1565b92506020840135613b33816139a1565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b96578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613b59565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613bdb60c0840182613a2f565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613c178383613a2f565b925060808601519150808584030160a086015250613ace8282613b44565b60008060408385031215613c4857600080fd5b823591506020830135613c5a816139a1565b809150509250929050565b60008083601f840112613c7757600080fd5b50813567ffffffffffffffff811115613c8f57600080fd5b6020830191508360208260051b8501011115613caa57600080fd5b9250929050565b60008060008060408587031215613cc757600080fd5b843567ffffffffffffffff80821115613cdf57600080fd5b613ceb88838901613c65565b90965094506020870135915080821115613d0457600080fd5b50613d1187828801613c65565b95989497509550505050565b600060208284031215613d2f57600080fd5b813567ffffffffffffffff811115613d4657600080fd5b820160a0818503121561309457600080fd5b60008060208385031215613d6b57600080fd5b823567ffffffffffffffff811115613d8257600080fd5b613d8e85828601613c65565b90969095509350505050565b60008060408385031215613dad57600080fd5b8235613db881613906565b91506020830135613c5a816139a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613e1a57613e1a613dc8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e6757613e67613dc8565b604052919050565b600082601f830112613e8057600080fd5b813567ffffffffffffffff811115613e9a57613e9a613dc8565b613ecb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613e20565b818152846020838601011115613ee057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613f1257600080fd5b8335613f1d81613906565b925060208481013567ffffffffffffffff80821115613f3b57600080fd5b818701915087601f830112613f4f57600080fd5b813581811115613f6157613f61613dc8565b613f6f848260051b01613e20565b81815260069190911b8301840190848101908a831115613f8e57600080fd5b938501935b82851015613fda576040858c031215613fac5760008081fd5b613fb4613df7565b8535613fbf816139a1565b81528587013587820152825260409094019390850190613f93565b965050506040870135925080831115613ff257600080fd5b505061400086828701613e6f565b9150509250925092565b60006020828403121561401c57600080fd5b813560ff8116811461309457600080fd5b8183823760009101908152919050565b600181811c9082168061405157607f821691505b60208210810361408a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126140f357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261413257600080fd5b83018035915067ffffffffffffffff82111561414d57600080fd5b602001915036819003821315613caa57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261419757600080fd5b830160208101925035905067ffffffffffffffff8111156141b757600080fd5b803603821315613caa57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b96578135614232816139a1565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161421f565b60208152813560208201526000602083013561427f81613906565b67ffffffffffffffff808216604085015261429d6040860186614162565b925060a060608601526142b460c0860184836141c6565b9250506142c46060860186614162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526142fa8583856141c6565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261433357600080fd5b6020928801928301923591508382111561434c57600080fd5b8160061b360383131561435e57600080fd5b8685030160a087015261370d84828461420f565b601f8211156117df576000816000526020600020601f850160051c8101602086101561439b5750805b601f850160051c820191505b8181101561225d578281556001016143a7565b67ffffffffffffffff8311156143d2576143d2613dc8565b6143e6836143e0835461403d565b83614372565b6000601f84116001811461443857600085156144025750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556115d4565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156144875786850135825560209485019460019092019101614467565b50868210156144c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561450e816139a1565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561457457614574613dc8565b8054838255808410156146015760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146145b5576145b56144d4565b80861686146145c6576145c66144d4565b5060008360005260206000208360011b81018760011b820191505b808210156145fc5782825582848301556002820191506145e1565b505050505b5060008181526020812083915b8581101561225d576146208383614503565b604092909201916002919091019060010161460e565b8135815560018101602083013561464c81613906565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561468c60408601866140fd565b9350915061469e8383600287016143ba565b6146ab60608601866140fd565b935091506146bd8383600387016143ba565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126146f457600080fd5b91840191823591508082111561470957600080fd5b506020820191508060061b360382131561472257600080fd5b612e2681836004860161455b565b600082614766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561477d57600080fd5b8151613094816139a1565b815167ffffffffffffffff8111156147a2576147a2613dc8565b6147b6816147b0845461403d565b84614372565b602080601f83116001811461480957600084156147d35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561225d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561485657888601518255948401946001909101908401614837565b508582101561489257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126140f357600080fd5b6020815260006132586020830184866141c6565b600082516140f3818460208701613a0b565b80820180821115610b7957610b796144d4565b67ffffffffffffffff83168152604060208201526000825160a0604084015261493b60e0840182613a2f565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526149778383613a2f565b925060408601519150808584030160808601526149948383613b44565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149d28282613a2f565b9695505050505050565b6000602082840312156149ee57600080fd5b5051919050565b600060208284031215614a0757600080fd5b8151613094816139e056fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620051393803806200513983398101604081905262000034916200059b565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000177565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b0382168360001962000222565b5050505050508060026200015491906200060a565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070a565b336001600160a01b03821603620001d15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029a919062000630565b620002a691906200064a565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000302918691906200030816565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000357906001600160a01b038516908490620003de565b805190915015620003d9578080602001905181019062000378919062000666565b620003d95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003ef8484600085620003f7565b949350505050565b6060824710156200045a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004789190620006b7565b60006040518083038185875af1925050503d8060008114620004b7576040519150601f19603f3d011682016040523d82523d6000602084013e620004bc565b606091505b509092509050620004d087838387620004db565b979650505050505050565b606083156200054f57825160000362000547576001600160a01b0385163b620005475760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003ef565b620003ef8383815115620005665781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006d5565b6001600160a01b03811681146200059857600080fd5b50565b600080600060608486031215620005b157600080fd5b8351620005be8162000582565b6020850151909350620005d18162000582565b604085015190925060ff81168114620005e957600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff8181168382160290811690818114620006295762000629620005f4565b5092915050565b6000602082840312156200064357600080fd5b5051919050565b80820180821115620006605762000660620005f4565b92915050565b6000602082840312156200067957600080fd5b815180151581146200068a57600080fd5b9392505050565b60005b83811015620006ae57818101518382015260200162000694565b50506000910152565b60008251620006cb81846020870162000691565b9190910192915050565b6020815260008251806020840152620006f681604085016020870162000691565b601f01601f19169190910160400192915050565b614a1f806200071a6000396000f3fe60806040526004361061021d5760003560e01c80638da5cb5b1161011d578063c851cc32116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063c851cc3214610662578063c89245d514610682578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b8063b0f479a1116100ec578063b0f479a1146105b6578063b187bd26146105e1578063b5a1101114610619578063bee518a41461063957600080fd5b80638da5cb5b1461052b5780638f491cba146105565780639d2aede5146105765780639fe74e261461059657600080fd5b80635075a9d4116101b05780636d62d6331161017f57806379ba50971161016457806379ba5097146104d65780638462a2b9146104eb57806385572ffb1461050b57600080fd5b80636d62d6331461046d5780636fef519e1461048d57600080fd5b80635075a9d4146103d2578063536c6bfa146104005780635e35359e146104205780636939cd971461044057600080fd5b80631892b906116101ec5780631892b906146103175780632874d8bf146103375780632b6e5d631461034c57806335f170ef146103a457600080fd5b806305bfe982146102295780630e958d6b1461026f57806316c38b3c1461029f578063181f5a77146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b506102596102443660046138ac565b60096020526000908152604090205460ff1681565b60405161026691906138c5565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461391c565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba3660046139af565b6107f3565b005b3480156102cd57600080fd5b5061030a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613a3a565b34801561032357600080fd5b506102bf610332366004613a4d565b61084d565b34801561034357600080fd5b506102bf610890565b34801561035857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103b057600080fd5b506103c46103bf366004613a4d565b6108cc565b604051610266929190613a6a565b3480156103de57600080fd5b506103f26103ed3660046138ac565b6109f8565b604051908152602001610266565b34801561040c57600080fd5b506102bf61041b366004613aba565b610a0b565b34801561042c57600080fd5b506102bf61043b366004613ae6565b610a6f565b34801561044c57600080fd5b5061046061045b3660046138ac565b610b04565b6040516102669190613b84565b34801561047957600080fd5b506102bf610488366004613c18565b610d0f565b34801561049957600080fd5b5061030a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104e257600080fd5b506102bf611029565b3480156104f757600080fd5b506102bf610506366004613c94565b611126565b34801561051757600080fd5b506102bf610526366004613d00565b611467565b34801561053757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661037f565b34801561056257600080fd5b506102bf6105713660046138ac565b611670565b34801561058257600080fd5b506102bf610591366004613d3b565b61184c565b3480156105a257600080fd5b506102bf6105b1366004613d58565b611907565b3480156105c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661037f565b3480156105ed57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561062557600080fd5b506102bf610634366004613d9a565b611c98565b34801561064557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b34801561066e57600080fd5b506102bf61067d366004613d3b565b611e08565b34801561068e57600080fd5b506102bf61069d366004613d3b565b611ed4565b3480156106ae57600080fd5b506102bf6106bd366004613d00565b612048565b3480156106ce57600080fd5b506102bf6106dd3660046138ac565b612265565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b6103f2610736366004613efd565b6124cf565b34801561074757600080fd5b506102bf61075636600461400a565b612a05565b34801561076757600080fd5b506102bf610776366004613d3b565b612a96565b34801561078757600080fd5b5060085461037f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d7908590859061402d565b9081526040519081900360200190205460ff1690509392505050565b6107fb612aa7565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b610855612aa7565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610898612aa7565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556108ca6001612b28565b565b6003602052600090815260409020805481906108e79061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546109139061403d565b80156109605780601f1061093557610100808354040283529160200191610960565b820191906000526020600020905b81548152906001019060200180831161094357829003601f168201915b5050505050908060010180546109759061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546109a19061403d565b80156109ee5780601f106109c3576101008083540402835291602001916109ee565b820191906000526020600020905b8154815290600101906020018083116109d157829003601f168201915b5050505050905082565b6000610a05600583612d84565b92915050565b610a13612aa7565b610a1d8282612d97565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610a77612aa7565b610a9873ffffffffffffffffffffffffffffffffffffffff84168383612ef1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610af791815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610b739061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f9061403d565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b50505050508152602001600382018054610c059061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c319061403d565b8015610c7e5780601f10610c5357610100808354040283529160200191610c7e565b820191906000526020600020905b815481529060010190602001808311610c6157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d015760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cac565b505050915250909392505050565b610d17612aa7565b6001610d24600584612d84565b14610d63576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610d738260025b60059190612fc5565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610dbb9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610de79061403d565b8015610e345780601f10610e0957610100808354040283529160200191610e34565b820191906000526020600020905b815481529060010190602001808311610e1757829003601f168201915b50505050508152602001600382018054610e4d9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e799061403d565b8015610ec65780601f10610e9b57610100808354040283529160200191610ec6565b820191906000526020600020905b815481529060010190602001808311610ea957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f495760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ef4565b5050505081525050905060005b816080015151811015610fd857610fd08383608001518381518110610f7d57610f7d614090565b60200260200101516020015184608001518481518110610f9f57610f9f614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ef19092919063ffffffff16565b600101610f56565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610d5a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61112e612aa7565b60005b818110156112c1576003600084848481811061114f5761114f614090565b905060200281019061116191906140bf565b61116f906020810190613a4d565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106111a6576111a6614090565b90506020028101906111b891906140bf565b6111c69060208101906140fd565b6040516111d492919061402d565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061121b5761121b614090565b905060200281019061122d91906140bf565b61123b9060208101906140fd565b60405161124992919061402d565b604051809103902083838381811061126357611263614090565b905060200281019061127591906140bf565b611283906020810190613a4d565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611131565b5060005b83811015611460576001600360008787858181106112e5576112e5614090565b90506020028101906112f791906140bf565b611305906020810190613a4d565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061133c5761133c614090565b905060200281019061134e91906140bf565b61135c9060208101906140fd565b60405161136a92919061402d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106113ba576113ba614090565b90506020028101906113cc91906140bf565b6113da9060208101906140fd565b6040516113e892919061402d565b604051809103902085858381811061140257611402614090565b905060200281019061141491906140bf565b611422906020810190613a4d565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016112c5565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146114ba576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610d5a565b6114ca6040820160208301613a4d565b67ffffffffffffffff81166000908152600360205260409020805481906114f09061403d565b9050600003611537576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d5a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611573908690600401614264565b600060405180830381600087803b15801561158d57600080fd5b505af192505050801561159e575060015b61163e573d8080156115cc576040519150601f19603f3d011682016040523d82523d6000602084013e6115d1565b606091505b506115de84356001610d6a565b508335600090815260046020526040902084906115fb8282614636565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611630908490613a3a565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff1615806116c85750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156116d05750565b600a54600190611704907d010000000000000000000000000000000000000000000000000000000000900460ff1683614730565b116118495760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c0919061476b565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561180757600080fd5b505af115801561181b573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611854612aa7565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906119039082614788565b5050565b61190f612aa7565b60005b8181101561166b5782828281811061192c5761192c614090565b905060200281019061193e91906148a2565b61194f9060408101906020016139af565b611a1b576003600084848481811061196957611969614090565b905060200281019061197b91906148a2565b611989906020810190613a4d565b67ffffffffffffffff168152602081019190915260400160009081206119ae9161385e565b8282828181106119c0576119c0614090565b90506020028101906119d291906148a2565b6119e0906020810190613a4d565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611c90565b828282818110611a2d57611a2d614090565b9050602002810190611a3f91906148a2565b611a4d9060408101906140fd565b9050600003611a88576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611aa057611aa0614090565b9050602002810190611ab291906148a2565b611ac0906020810190613a4d565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611af657611af6614090565b9050602002810190611b0891906148a2565b611b169060408101906140fd565b8291611b239190836143ba565b50838383818110611b3657611b36614090565b9050602002810190611b4891906148a2565b611b569060608101906140fd565b159050611ba157838383818110611b6f57611b6f614090565b9050602002810190611b8191906148a2565b611b8f9060608101906140fd565b6001830191611b9f9190836143ba565b505b838383818110611bb357611bb3614090565b9050602002810190611bc591906148a2565b611bd39060408101906140fd565b604051611be192919061402d565b6040518091039020848484818110611bfb57611bfb614090565b9050602002810190611c0d91906148a2565b611c1b906020810190613a4d565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611c5857611c58614090565b9050602002810190611c6a91906148a2565b611c789060608101906140fd565b604051611c869291906148d6565b60405180910390a3505b600101611912565b611ca0612aa7565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611d5b916148ea565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061166b9082614788565b611e10612aa7565b73ffffffffffffffffffffffffffffffffffffffff8116611e5d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611edc612aa7565b60085473ffffffffffffffffffffffffffffffffffffffff1615611f3d57611f3d611f1c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612fda565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611fea57611fea611faa60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61315c565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014612081576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120916040820160208301613a4d565b61209e60408301836140fd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506120f59250905061403d565b1590508061214b5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161213691906148ea565b9081526040519081900360200190205460ff16155b1561218457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610d5a9190613a3a565b6121946040840160208501613a4d565b67ffffffffffffffff81166000908152600360205260409020805481906121ba9061403d565b9050600003612201576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d5a565b600061221060608701876140fd565b81019061221d91906138ac565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff1661225d5761225d6122588260016148fc565b612b28565b505050505050565b6001612272600583612d84565b146122ac576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610d5a565b6122b7816000610d6a565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916122ff9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461232b9061403d565b80156123785780601f1061234d57610100808354040283529160200191612378565b820191906000526020600020905b81548152906001019060200180831161235b57829003601f168201915b505050505081526020016003820180546123919061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd9061403d565b801561240a5780601f106123df5761010080835404028352916020019161240a565b820191906000526020600020905b8154815290600101906020018083116123ed57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561248d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612438565b505050508152505090506124a081613260565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906124f89061403d565b905060000361253f576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d5a565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061256f9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461259b9061403d565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916126499061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546126759061403d565b80156126c25780601f10612697576101008083540402835291602001916126c2565b820191906000526020600020905b8154815290600101906020018083116126a557829003601f168201915b5050505050815250905060005b865181101561281f5761273f33308984815181106126ef576126ef614090565b6020026020010151602001518a858151811061270d5761270d614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132d2909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061276f5761276f614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146128175760025487516128179173ffffffffffffffffffffffffffffffffffffffff16908990849081106127c8576127c8614090565b6020026020010151602001518984815181106127e6576127e6614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612fda9092919063ffffffff16565b6001016126cf565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612879908b90869060040161490f565b602060405180830381865afa158015612896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ba91906149dc565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612900576008546129009073ffffffffffffffffffffffffffffffffffffffff163330846132d2565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612932576000612934565b825b8a856040518463ffffffff1660e01b815260040161295392919061490f565b60206040518083038185885af1158015612971573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061299691906149dc565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612a0d612aa7565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a9e612aa7565b61184981613330565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610d5a565b80600116600103612b6b576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b9f565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612ba881611670565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612c0c91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612c8657816020015b6040805180820190915260008082526020820152815260200190600190039081612c5f5790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612cdd60025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f991612d419167ffffffffffffffff90911690859060040161490f565b6020604051808303816000875af1158015612d60573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906149dc565b6000612d908383613425565b9392505050565b80471015612e01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d5a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e5b576040519150601f19603f3d011682016040523d82523d6000602084013e612e60565b606091505b505090508061166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d5a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261166b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526134af565b6000612fd28484846135bb565b949350505050565b80158061307a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307891906149dc565b155b613106576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610d5a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261166b9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f43565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156131d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f791906149dc565b61320191906148fc565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061325a9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f43565b50505050565b613268612aa7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906132a4908490600401613b84565b600060405180830381600087803b1580156132be57600080fd5b505af1158015611460573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261325a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612f43565b3373ffffffffffffffffffffffffffffffffffffffff8216036133af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610d5a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580613449575061344984846135d8565b612d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610d5a565b6000613511826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135e49092919063ffffffff16565b80519091501561166b578080602001905181019061352f91906149f5565b61166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d5a565b60008281526002840160205260408120829055612fd284846135f3565b6000612d9083836135ff565b6060612fd28484600085613617565b6000612d908383613730565b60008181526001830160205260408120541515612d90565b6060824710156136a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d5a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136d291906148ea565b60006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091506137258783838761377f565b979650505050505050565b600081815260018301602052604081205461377757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a05565b506000610a05565b6060831561381557825160000361380e5773ffffffffffffffffffffffffffffffffffffffff85163b61380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d5a565b5081612fd2565b612fd2838381511561382a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a9190613a3a565b50805461386a9061403d565b6000825580601f1061387a575050565b601f01602090049060005260206000209081019061184991905b808211156138a85760008155600101613894565b5090565b6000602082840312156138be57600080fd5b5035919050565b6020810160038310613900577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461184957600080fd5b60008060006040848603121561393157600080fd5b833561393c81613906565b9250602084013567ffffffffffffffff8082111561395957600080fd5b818601915086601f83011261396d57600080fd5b81358181111561397c57600080fd5b87602082850101111561398e57600080fd5b6020830194508093505050509250925092565b801515811461184957600080fd5b6000602082840312156139c157600080fd5b8135612d90816139a1565b60005b838110156139e75781810151838201526020016139cf565b50506000910152565b60008151808452613a088160208601602086016139cc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d9060208301846139f0565b600060208284031215613a5f57600080fd5b8135612d9081613906565b604081526000613a7d60408301856139f0565b8281036020840152613a8f81856139f0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461184957600080fd5b60008060408385031215613acd57600080fd5b8235613ad881613a98565b946020939093013593505050565b600080600060608486031215613afb57600080fd5b8335613b0681613a98565b92506020840135613b1681613a98565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b79578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613b3c565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613bbe60c08401826139f0565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613bfa83836139f0565b925060808601519150808584030160a086015250613a8f8282613b27565b60008060408385031215613c2b57600080fd5b823591506020830135613c3d81613a98565b809150509250929050565b60008083601f840112613c5a57600080fd5b50813567ffffffffffffffff811115613c7257600080fd5b6020830191508360208260051b8501011115613c8d57600080fd5b9250929050565b60008060008060408587031215613caa57600080fd5b843567ffffffffffffffff80821115613cc257600080fd5b613cce88838901613c48565b90965094506020870135915080821115613ce757600080fd5b50613cf487828801613c48565b95989497509550505050565b600060208284031215613d1257600080fd5b813567ffffffffffffffff811115613d2957600080fd5b820160a08185031215612d9057600080fd5b600060208284031215613d4d57600080fd5b8135612d9081613a98565b60008060208385031215613d6b57600080fd5b823567ffffffffffffffff811115613d8257600080fd5b613d8e85828601613c48565b90969095509350505050565b60008060408385031215613dad57600080fd5b8235613db881613906565b91506020830135613c3d81613a98565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613e1a57613e1a613dc8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e6757613e67613dc8565b604052919050565b600082601f830112613e8057600080fd5b813567ffffffffffffffff811115613e9a57613e9a613dc8565b613ecb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613e20565b818152846020838601011115613ee057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613f1257600080fd5b8335613f1d81613906565b925060208481013567ffffffffffffffff80821115613f3b57600080fd5b818701915087601f830112613f4f57600080fd5b813581811115613f6157613f61613dc8565b613f6f848260051b01613e20565b81815260069190911b8301840190848101908a831115613f8e57600080fd5b938501935b82851015613fda576040858c031215613fac5760008081fd5b613fb4613df7565b8535613fbf81613a98565b81528587013587820152825260409094019390850190613f93565b965050506040870135925080831115613ff257600080fd5b505061400086828701613e6f565b9150509250925092565b60006020828403121561401c57600080fd5b813560ff81168114612d9057600080fd5b8183823760009101908152919050565b600181811c9082168061405157607f821691505b60208210810361408a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126140f357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261413257600080fd5b83018035915067ffffffffffffffff82111561414d57600080fd5b602001915036819003821315613c8d57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261419757600080fd5b830160208101925035905067ffffffffffffffff8111156141b757600080fd5b803603821315613c8d57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b7957813561423281613a98565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161421f565b60208152813560208201526000602083013561427f81613906565b67ffffffffffffffff808216604085015261429d6040860186614162565b925060a060608601526142b460c0860184836141c6565b9250506142c46060860186614162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526142fa8583856141c6565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261433357600080fd5b6020928801928301923591508382111561434c57600080fd5b8160061b360383131561435e57600080fd5b8685030160a087015261372584828461420f565b601f82111561166b576000816000526020600020601f850160051c8101602086101561439b5750805b601f850160051c820191505b8181101561225d578281556001016143a7565b67ffffffffffffffff8311156143d2576143d2613dc8565b6143e6836143e0835461403d565b83614372565b6000601f84116001811461443857600085156144025750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611460565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156144875786850135825560209485019460019092019101614467565b50868210156144c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561450e81613a98565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561457457614574613dc8565b8054838255808410156146015760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146145b5576145b56144d4565b80861686146145c6576145c66144d4565b5060008360005260206000208360011b81018760011b820191505b808210156145fc5782825582848301556002820191506145e1565b505050505b5060008181526020812083915b8581101561225d576146208383614503565b604092909201916002919091019060010161460e565b8135815560018101602083013561464c81613906565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561468c60408601866140fd565b9350915061469e8383600287016143ba565b6146ab60608601866140fd565b935091506146bd8383600387016143ba565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126146f457600080fd5b91840191823591508082111561470957600080fd5b506020820191508060061b360382131561472257600080fd5b61325a81836004860161455b565b600082614766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561477d57600080fd5b8151612d9081613a98565b815167ffffffffffffffff8111156147a2576147a2613dc8565b6147b6816147b0845461403d565b84614372565b602080601f83116001811461480957600084156147d35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561225d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561485657888601518255948401946001909101908401614837565b508582101561489257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126140f357600080fd5b602081526000612fd26020830184866141c6565b600082516140f38184602087016139cc565b80820180821115610a0557610a056144d4565b67ffffffffffffffff83168152604060208201526000825160a0604084015261493b60e08401826139f0565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261497783836139f0565b925060408601519150808584030160808601526149948383613b27565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149d282826139f0565b9695505050505050565b6000602082840312156149ee57600080fd5b5051919050565b600060208284031215614a0757600080fd5b8151612d90816139a156fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -584,18 +584,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) FundPingPong(pin 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) } @@ -716,6 +704,18 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateApprovedSe return _SelfFundedPingPong.Contract.UpdateApprovedSenders(&_SelfFundedPingPong.TransactOpts, adds, removes) } +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "updateFeeToken", token) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateFeeToken(&_SelfFundedPingPong.TransactOpts, token) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdateFeeToken(&_SelfFundedPingPong.TransactOpts, token) +} + func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "updateRouter", newRouter) } @@ -1553,8 +1553,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseCountIncrBeforeFundi return event, nil } -type SelfFundedPingPongFeeTokenModifiedIterator struct { - Event *SelfFundedPingPongFeeTokenModified +type SelfFundedPingPongFeeTokenUpdatedIterator struct { + Event *SelfFundedPingPongFeeTokenUpdated contract *bind.BoundContract event string @@ -1565,7 +1565,7 @@ type SelfFundedPingPongFeeTokenModifiedIterator struct { fail error } -func (it *SelfFundedPingPongFeeTokenModifiedIterator) Next() bool { +func (it *SelfFundedPingPongFeeTokenUpdatedIterator) Next() bool { if it.fail != nil { return false @@ -1574,7 +1574,7 @@ func (it *SelfFundedPingPongFeeTokenModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongFeeTokenModified) + it.Event = new(SelfFundedPingPongFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1589,7 +1589,7 @@ func (it *SelfFundedPingPongFeeTokenModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongFeeTokenModified) + it.Event = new(SelfFundedPingPongFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1604,22 +1604,22 @@ func (it *SelfFundedPingPongFeeTokenModifiedIterator) Next() bool { } } -func (it *SelfFundedPingPongFeeTokenModifiedIterator) Error() error { +func (it *SelfFundedPingPongFeeTokenUpdatedIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongFeeTokenModifiedIterator) Close() error { +func (it *SelfFundedPingPongFeeTokenUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongFeeTokenModified struct { +type SelfFundedPingPongFeeTokenUpdated 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) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenUpdatedIterator, error) { var oldTokenRule []interface{} for _, oldTokenItem := range oldToken { @@ -1630,14 +1630,14 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFeeTokenModified(op newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) if err != nil { return nil, err } - return &SelfFundedPingPongFeeTokenModifiedIterator{contract: _SelfFundedPingPong.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil + return &SelfFundedPingPongFeeTokenUpdatedIterator{contract: _SelfFundedPingPong.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { var oldTokenRule []interface{} for _, oldTokenItem := range oldToken { @@ -1648,7 +1648,7 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenModified(opt newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) if err != nil { return nil, err } @@ -1658,8 +1658,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenModified(opt select { case log := <-logs: - event := new(SelfFundedPingPongFeeTokenModified) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + event := new(SelfFundedPingPongFeeTokenUpdated) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return err } event.Raw = log @@ -1680,9 +1680,9 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenModified(opt }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFeeTokenModified(log types.Log) (*SelfFundedPingPongFeeTokenModified, error) { - event := new(SelfFundedPingPongFeeTokenModified) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFeeTokenUpdated(log types.Log) (*SelfFundedPingPongFeeTokenUpdated, error) { + event := new(SelfFundedPingPongFeeTokenUpdated) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return nil, err } event.Raw = log @@ -3347,8 +3347,8 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate return _SelfFundedPingPong.ParseChainRemoved(log) case _SelfFundedPingPong.abi.Events["CountIncrBeforeFundingSet"].ID: return _SelfFundedPingPong.ParseCountIncrBeforeFundingSet(log) - case _SelfFundedPingPong.abi.Events["FeeTokenModified"].ID: - return _SelfFundedPingPong.ParseFeeTokenModified(log) + case _SelfFundedPingPong.abi.Events["FeeTokenUpdated"].ID: + return _SelfFundedPingPong.ParseFeeTokenUpdated(log) case _SelfFundedPingPong.abi.Events["Funded"].ID: return _SelfFundedPingPong.ParseFunded(log) case _SelfFundedPingPong.abi.Events["MessageAbandoned"].ID: @@ -3405,8 +3405,8 @@ func (SelfFundedPingPongCountIncrBeforeFundingSet) Topic() common.Hash { return common.HexToHash("0x4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf3") } -func (SelfFundedPingPongFeeTokenModified) Topic() common.Hash { - return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") +func (SelfFundedPingPongFeeTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67") } func (SelfFundedPingPongFunded) Topic() common.Hash { @@ -3508,8 +3508,6 @@ type SelfFundedPingPongInterface interface { 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) @@ -3530,6 +3528,8 @@ type SelfFundedPingPongInterface interface { UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -3574,11 +3574,11 @@ type SelfFundedPingPongInterface interface { ParseCountIncrBeforeFundingSet(log types.Log) (*SelfFundedPingPongCountIncrBeforeFundingSet, error) - FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenModifiedIterator, error) + FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenUpdatedIterator, error) - WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) - ParseFeeTokenModified(log types.Log) (*SelfFundedPingPongFeeTokenModified, error) + ParseFeeTokenUpdated(log types.Log) (*SelfFundedPingPongFeeTokenUpdated, error) FilterFunded(opts *bind.FilterOpts) (*SelfFundedPingPongFundedIterator, 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 eb9d001395..372f2eedf7 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 f03e364b78e6af4a4be1f0e4b023a43c0a6786572a8c8c1fe0a3449dce968ab5 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 3f0dfdc726b764afa0dca19c1974a2d50e785423ff2035023f4ca7cf7933e4a6 ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0d7d496ff6aaf37fcf8db25c708b6977c841650027a2028c864f7a0e17fa7b08 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 3f3cd6cb13008bae846d8778aab17c57d213e45da85ba8dd6d42937e8b7f3120 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e6bfb15f1f320cceb76435f49b43c90bfcfc69b4561c811c4b938a6356a23566 ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin e142b529faf36c9dbc55be72947493f235e1d6ac2d76658a2273ac8e53ac4f5e 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 bc351871c8749c4d7d2ea05c0a72c9ff3de8cbb2b3438e7d6cc8cc2e3958764b +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin e6f9d5162853fdd411df702394d5af7cfaee1d2c90ffd1e50259c0ce6b97f9b8 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 7bac5b635f48f56b579050796b43df59b9fb7cb7ef3f986ab056202bc2eefa0d +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin b088de65dc7d7d4e6f7ba534e7c6940e7fe8ba5fa47a120fc7745766a38ec58b 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 9defd5c5cff8bbd8c4d2b13b0a675071b2f820be Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 10 Jul 2024 10:49:32 -0400 Subject: [PATCH 39/61] fixed but with duplicate naming error --- contracts/gas-snapshots/ccip.gas-snapshot | 10 +++++----- .../applications/external/CCIPClientWithACKTest.t.sol | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 134846b15e..012bba85e0 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -35,15 +35,15 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientTest:test_HappyPath_Success() (gas: 192504) -CCIPClientTest:test_ccipReceiveAndSendAck_Success() (gas: 331795) -CCIPClientTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438714) -CCIPClientTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348231) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325792) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218834) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376797) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) -CCIPClientTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552182) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331795) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438714) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348231) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552182) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357994) diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index 7907c25e8d..a2f2ba645c 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -12,7 +12,7 @@ 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 { +contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { event MessageFailed(bytes32 indexed messageId, bytes reason); event MessageSucceeded(bytes32 indexed messageId); event MessageRecovered(bytes32 indexed messageId); From 3e9bb2c54aea4d6f1e0d8bc876bde468f6ab41c2 Mon Sep 17 00:00:00 2001 From: Matt Yang Date: Thu, 11 Jul 2024 01:38:10 -0400 Subject: [PATCH 40/61] small nits --- .../v0.8/ccip/applications/external/CCIPBase.sol | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 205db1cd14..c49887a857 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -8,7 +8,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ import {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"; /// @title CCIPBase -/// @notice This contains the boilerplate code for managing chains and tokens your contract may interact with as part of CCIP. It does not send or receive messages through CCIP only manages supported chains and sources/destinations. +/// @notice This contains the boilerplate code for managing chains and tokens your contract may interact with as part of CCIP. /// @dev This contract is abstract, but does not have any functions which must be implemented by a child. abstract contract CCIPBase is OwnerIsCreator { using SafeERC20 for IERC20; @@ -38,10 +38,10 @@ abstract contract CCIPBase is OwnerIsCreator { } struct ChainUpdate { - uint64 chainSelector; // ──╮ The unique identifier for a chain to send/receive messages - bool allowed; // ──╯ Whether the chain should be enabled - bytes recipient; // Address on the remote chain which should receive incoming messages from this. The should only be one per-chain - bytes extraArgsBytes; // Additional arguments to pass with the message including manually specifying gas limit and and whether to allow out-of-order execution + uint64 chainSelector; // The unique identifier for a chain to send/receive messages + bool allowed; // Whether the chain should be enabled + bytes recipient; // Address on the remote chain which should receive incoming messages from this. The should only be one per-chain + bytes extraArgsBytes; // Additional arguments to pass with the message including manually specifying gas limit and and whether to allow out-of-order execution } struct ChainConfig { @@ -68,7 +68,7 @@ abstract contract CCIPBase is OwnerIsCreator { return s_ccipRouter; } - /// @dev only calls from the set router are accepted. + /// @notice only calls from the set router are accepted. modifier onlyRouter() { if (msg.sender != getRouter()) revert InvalidRouter(msg.sender); _; @@ -157,7 +157,6 @@ abstract contract CCIPBase is OwnerIsCreator { emit CCIPRouterModified(currentRouter, newRouter); } - // Reference similar function in TokenPool /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP function applyChainUpdates(ChainUpdate[] calldata chains) external onlyOwner { for (uint256 i = 0; i < chains.length; ++i) { From 9d6199b0ee9e581b45dc5f7fe5f5ced976ed7973 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 15 Jul 2024 10:35:03 -0400 Subject: [PATCH 41/61] update gethwrappers for missing example contract --- .../scripts/native_solc_compile_all_ccip | 1 + .../ccipClientWithACK/ccipClientWithACK.go | 2931 +++++++++++++++++ .../ccipReceiverWithAck.go | 2160 ++++++++---- ...rapper-dependency-versions-do-not-edit.txt | 1 + core/gethwrappers/ccip/go_generate.go | 1 + 5 files changed, 4509 insertions(+), 585 deletions(-) create mode 100644 core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 6935c310bc..6e2e2a86bf 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -57,6 +57,7 @@ compileContract ccip/offRamp/EVM2EVMMultiOffRamp.sol compileContract ccip/applications/internal/PingPongDemo.sol compileContract ccip/applications/internal/SelfFundedPingPong.sol compileContract ccip/applications/external/CCIPClient.sol +compileContract ccip/applications/external/CCIPClientWithACK.sol compileContract ccip/applications/external/CCIPReceiver.sol compileContract ccip/applications/external/CCIPReceiverWithACK.sol compileContract ccip/applications/external/CCIPSender.sol diff --git a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go new file mode 100644 index 0000000000..99da9a0a1d --- /dev/null +++ b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go @@ -0,0 +1,2931 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccipClientWithACK + +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 CCIPBaseApprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + +type ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +var CCIPClientWithACKMetaData = &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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004aea38038062004aea833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b61444c806200069e6000396000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063c89245d514610448578063cf6730f814610468578063e4ca87541461048857600080fd5b80639fe74e26116100b05780639fe74e26146103dd578063b0f479a1146103fd578063c851cc321461042857600080fd5b806385572ffb146103715780638da5cb5b1461039157600080fd5b80635e35359e1161012d5780636fef519e116101075780636fef519e146102e657806379ba50971461033c5780638462a2b91461035157600080fd5b80635e35359e146102795780636939cd97146102995780636d62d633146102c657600080fd5b806335f170ef1161015e57806335f170ef146101fb5780635075a9d414610229578063536c6bfa1461025757600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a03660046132e5565b60096020526000908152604090205460ff1681565b6040516101c2919061332d565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613384565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b610216366004613409565b610553565b6040516101c2929190613494565b34801561023557600080fd5b506102496102443660046132e5565b61067f565b6040519081526020016101c2565b34801561026357600080fd5b506102776102723660046134e4565b610692565b005b34801561028557600080fd5b50610277610294366004613510565b6106f6565b3480156102a557600080fd5b506102b96102b43660046132e5565b61078b565b6040516101c291906135ae565b3480156102d257600080fd5b506102776102e1366004613642565b610996565b3480156102f257600080fd5b5061032f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c29190613672565b34801561034857600080fd5b50610277610cb0565b34801561035d57600080fd5b5061027761036c3660046136d1565b610dad565b34801561037d57600080fd5b5061027761038c36600461373d565b6110ee565b34801561039d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103e957600080fd5b506102776103f8366004613778565b6112f7565b34801561040957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103b8565b34801561043457600080fd5b506102776104433660046137ba565b611688565b34801561045457600080fd5b506102776104633660046137ba565b611754565b34801561047457600080fd5b5061027761048336600461373d565b6118c8565b34801561049457600080fd5b506102776104a33660046132e5565b611c16565b6102496104b636600461393d565b611e80565b3480156104c757600080fd5b506102776104d63660046137ba565b6123b6565b3480156104e757600080fd5b506008546103b89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105379085908590613a4a565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061056e90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461059a90613a5a565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b5050505050908060010180546105fc90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461062890613a5a565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905082565b600061068c6005836123ca565b92915050565b61069a6123dd565b6106a48282612460565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6106fe6123dd565b61071f73ffffffffffffffffffffffffffffffffffffffff841683836125ba565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161077e91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107fa90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461082690613a5a565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160038201805461088c90613a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890613a5a565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109885760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610933565b505050915250909392505050565b61099e6123dd565b60016109ab6005846123ca565b146109ea576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109fa8260025b6005919061268e565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610a4290613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90613a5a565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b50505050508152602001600382018054610ad490613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090613a5a565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bd05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b7b565b5050505081525050905060005b816080015151811015610c5f57610c578383608001518381518110610c0457610c04613aad565b60200260200101516020015184608001518481518110610c2657610c26613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125ba9092919063ffffffff16565b600101610bdd565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109e1565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610db56123dd565b60005b81811015610f485760036000848484818110610dd657610dd6613aad565b9050602002810190610de89190613adc565b610df6906020810190613409565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e2d57610e2d613aad565b9050602002810190610e3f9190613adc565b610e4d906020810190613b1a565b604051610e5b929190613a4a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ea257610ea2613aad565b9050602002810190610eb49190613adc565b610ec2906020810190613b1a565b604051610ed0929190613a4a565b6040518091039020838383818110610eea57610eea613aad565b9050602002810190610efc9190613adc565b610f0a906020810190613409565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610db8565b5060005b838110156110e757600160036000878785818110610f6c57610f6c613aad565b9050602002810190610f7e9190613adc565b610f8c906020810190613409565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fc357610fc3613aad565b9050602002810190610fd59190613adc565b610fe3906020810190613b1a565b604051610ff1929190613a4a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061104157611041613aad565b90506020028101906110539190613adc565b611061906020810190613b1a565b60405161106f929190613a4a565b604051809103902085858381811061108957611089613aad565b905060200281019061109b9190613adc565b6110a9906020810190613409565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f4c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611141576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109e1565b6111516040820160208301613409565b67ffffffffffffffff811660009081526003602052604090208054819061117790613a5a565b90506000036111be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906111fa908690600401613c81565b600060405180830381600087803b15801561121457600080fd5b505af1925050508015611225575060015b6112c5573d808015611253576040519150601f19603f3d011682016040523d82523d6000602084013e611258565b606091505b50611265843560016109f1565b50833560009081526004602052604090208490611282828261405b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112b7908490613672565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6112ff6123dd565b60005b818110156112f25782828281811061131c5761131c613aad565b905060200281019061132e9190614155565b61133f906040810190602001614197565b61140b576003600084848481811061135957611359613aad565b905060200281019061136b9190614155565b611379906020810190613409565b67ffffffffffffffff1681526020810191909152604001600090812061139e91613297565b8282828181106113b0576113b0613aad565b90506020028101906113c29190614155565b6113d0906020810190613409565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611680565b82828281811061141d5761141d613aad565b905060200281019061142f9190614155565b61143d906040810190613b1a565b9050600003611478576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061149057611490613aad565b90506020028101906114a29190614155565b6114b0906020810190613409565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106114e6576114e6613aad565b90506020028101906114f89190614155565b611506906040810190613b1a565b8291611513919083613ddf565b5083838381811061152657611526613aad565b90506020028101906115389190614155565b611546906060810190613b1a565b1590506115915783838381811061155f5761155f613aad565b90506020028101906115719190614155565b61157f906060810190613b1a565b600183019161158f919083613ddf565b505b8383838181106115a3576115a3613aad565b90506020028101906115b59190614155565b6115c3906040810190613b1a565b6040516115d1929190613a4a565b60405180910390208484848181106115eb576115eb613aad565b90506020028101906115fd9190614155565b61160b906020810190613409565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061164857611648613aad565b905060200281019061165a9190614155565b611668906060810190613b1a565b6040516116769291906141b4565b60405180910390a3505b600101611302565b6116906123dd565b73ffffffffffffffffffffffffffffffffffffffff81166116dd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61175c6123dd565b60085473ffffffffffffffffffffffffffffffffffffffff16156117bd576117bd61179c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006126a3565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561186a5761186a61182a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612825565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611901576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119116040820160208301613409565b61191e6040830183613b1a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061197592509050613a5a565b159050806119cb5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516119b691906141c8565b9081526040519081900360200190205460ff16155b15611a0457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109e19190613672565b6000611a136060850185613b1a565b810190611a2091906141da565b9050600081604001516001811115611a3a57611a3a6132fe565b03611a4d57611a4884612923565b611c10565b600181604001516001811115611a6557611a656132fe565b03611c10576000808260200151806020019051810190611a859190614286565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611acf9190613672565b6040516020818303038152906040528051906020012082604051602001611af69190613672565b6040516020818303038152906040528051906020012014611b43576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526009602052604090205460ff166002811115611b6857611b686132fe565b14611ba2576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505b50505050565b6001611c236005836123ca565b14611c5d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b611c688160006109f1565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cb090613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdc90613a5a565b8015611d295780601f10611cfe57610100808354040283529160200191611d29565b820191906000526020600020905b815481529060010190602001808311611d0c57829003601f168201915b50505050508152602001600382018054611d4290613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6e90613a5a565b8015611dbb5780601f10611d9057610100808354040283529160200191611dbb565b820191906000526020600020905b815481529060010190602001808311611d9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611de9565b50505050815250509050611e5181612c99565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ea990613a5a565b9050600003611ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f2090613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4c90613a5a565b8015611f995780601f10611f6e57610100808354040283529160200191611f99565b820191906000526020600020905b815481529060010190602001808311611f7c57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ffa90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461202690613a5a565b80156120735780601f1061204857610100808354040283529160200191612073565b820191906000526020600020905b81548152906001019060200180831161205657829003601f168201915b5050505050815250905060005b86518110156121d0576120f033308984815181106120a0576120a0613aad565b6020026020010151602001518a85815181106120be576120be613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d0b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061212057612120613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121c85760025487516121c89173ffffffffffffffffffffffffffffffffffffffff169089908490811061217957612179613aad565b60200260200101516020015189848151811061219757612197613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126a39092919063ffffffff16565b600101612080565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded9061222a908b908690600401614307565b602060405180830381865afa158015612247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226b91906143d4565b60085490915073ffffffffffffffffffffffffffffffffffffffff16156122b1576008546122b19073ffffffffffffffffffffffffffffffffffffffff16333084612d0b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156122e35760006122e5565b825b8a856040518463ffffffff1660e01b8152600401612304929190614307565b60206040518083038185885af1158015612322573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061234791906143d4565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6123be6123dd565b6123c781612d69565b50565b60006123d68383612e5e565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109e1565b565b804710156124ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109e1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612524576040519150601f19603f3d011682016040523d82523d6000602084013e612529565b606091505b50509050806112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612ee8565b600061269b848484612ff4565b949350505050565b80158061274357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561271d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274191906143d4565b155b6127cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161260c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561289c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c091906143d4565b6128ca91906143ed565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611c109085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161260c565b6040805160008082526020820190925281612960565b60408051808201909152600080825260208201528152602001906001900390816129395790505b50905060006040518060a001604052808480604001906129809190613b1a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612a019288359101614400565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612a71918901908901613409565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612aa190613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054612acd90613a5a565b8015612b1a5780601f10612aef57610100808354040283529160200191612b1a565b820191906000526020600020905b815481529060010190602001808311612afd57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612b576040870160208801613409565b846040518363ffffffff1660e01b8152600401612b75929190614307565b602060405180830381865afa158015612b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb691906143d4565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612bee576000612bf0565b835b612c006040890160208a01613409565b866040518463ffffffff1660e01b8152600401612c1e929190614307565b60206040518083038185885af1158015612c3c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c6191906143d4565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b612ca16123dd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612cdd9084906004016135ae565b600060405180830381600087803b158015612cf757600080fd5b505af11580156110e7573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611c109085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161260c565b3373ffffffffffffffffffffffffffffffffffffffff821603612de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109e1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612e825750612e828484613011565b6123d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109e1565b6000612f4a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661301d9092919063ffffffff16565b8051909150156112f25780806020019051810190612f689190614422565b6112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109e1565b6000828152600284016020526040812082905561269b848461302c565b60006123d68383613038565b606061269b8484600085613050565b60006123d68383613169565b600081815260018301602052604081205415156123d6565b6060824710156130e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161310b91906141c8565b60006040518083038185875af1925050503d8060008114613148576040519150601f19603f3d011682016040523d82523d6000602084013e61314d565b606091505b509150915061315e878383876131b8565b979650505050505050565b60008181526001830160205260408120546131b05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561068c565b50600061068c565b6060831561324e5782516000036132475773ffffffffffffffffffffffffffffffffffffffff85163b613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e1565b508161269b565b61269b83838151156132635781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e19190613672565b5080546132a390613a5a565b6000825580601f106132b3575050565b601f0160209004906000526020600020908101906123c791905b808211156132e157600081556001016132cd565b5090565b6000602082840312156132f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613368577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146123c757600080fd5b60008060006040848603121561339957600080fd5b83356133a48161336e565b9250602084013567ffffffffffffffff808211156133c157600080fd5b818601915086601f8301126133d557600080fd5b8135818111156133e457600080fd5b8760208285010111156133f657600080fd5b6020830194508093505050509250925092565b60006020828403121561341b57600080fd5b81356123d68161336e565b60005b83811015613441578181015183820152602001613429565b50506000910152565b60008151808452613462816020860160208601613426565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006134a7604083018561344a565b82810360208401526134b9818561344a565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146123c757600080fd5b600080604083850312156134f757600080fd5b8235613502816134c2565b946020939093013593505050565b60008060006060848603121561352557600080fd5b8335613530816134c2565b92506020840135613540816134c2565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156135a3578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613566565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135e860c084018261344a565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613624838361344a565b925060808601519150808584030160a0860152506134b98282613551565b6000806040838503121561365557600080fd5b823591506020830135613667816134c2565b809150509250929050565b6020815260006123d6602083018461344a565b60008083601f84011261369757600080fd5b50813567ffffffffffffffff8111156136af57600080fd5b6020830191508360208260051b85010111156136ca57600080fd5b9250929050565b600080600080604085870312156136e757600080fd5b843567ffffffffffffffff808211156136ff57600080fd5b61370b88838901613685565b9096509450602087013591508082111561372457600080fd5b5061373187828801613685565b95989497509550505050565b60006020828403121561374f57600080fd5b813567ffffffffffffffff81111561376657600080fd5b820160a081850312156123d657600080fd5b6000806020838503121561378b57600080fd5b823567ffffffffffffffff8111156137a257600080fd5b6137ae85828601613685565b90969095509350505050565b6000602082840312156137cc57600080fd5b81356123d6816134c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613829576138296137d7565b60405290565b6040516060810167ffffffffffffffff81118282101715613829576138296137d7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613899576138996137d7565b604052919050565b600067ffffffffffffffff8211156138bb576138bb6137d7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126138f857600080fd5b813561390b613906826138a1565b613852565b81815284602083860101111561392057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561395257600080fd5b833561395d8161336e565b925060208481013567ffffffffffffffff8082111561397b57600080fd5b818701915087601f83011261398f57600080fd5b8135818111156139a1576139a16137d7565b6139af848260051b01613852565b81815260069190911b8301840190848101908a8311156139ce57600080fd5b938501935b82851015613a1a576040858c0312156139ec5760008081fd5b6139f4613806565b85356139ff816134c2565b815285870135878201528252604090940193908501906139d3565b965050506040870135925080831115613a3257600080fd5b5050613a40868287016138e7565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a6e57607f821691505b602082108103613aa7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613b1057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b4f57600080fd5b83018035915067ffffffffffffffff821115613b6a57600080fd5b6020019150368190038213156136ca57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bb457600080fd5b830160208101925035905067ffffffffffffffff811115613bd457600080fd5b8036038213156136ca57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156135a3578135613c4f816134c2565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613c3c565b602081528135602082015260006020830135613c9c8161336e565b67ffffffffffffffff8082166040850152613cba6040860186613b7f565b925060a06060860152613cd160c086018483613be3565b925050613ce16060860186613b7f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613d17858385613be3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613d5057600080fd5b60209288019283019235915083821115613d6957600080fd5b8160061b3603831315613d7b57600080fd5b8685030160a087015261315e848284613c2c565b601f8211156112f2576000816000526020600020601f850160051c81016020861015613db85750805b601f850160051c820191505b81811015613dd757828155600101613dc4565b505050505050565b67ffffffffffffffff831115613df757613df76137d7565b613e0b83613e058354613a5a565b83613d8f565b6000601f841160018114613e5d5760008515613e275750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110e7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613eac5786850135825560209485019460019092019101613e8c565b5086821015613ee7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613f33816134c2565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613f9957613f996137d7565b8054838255808410156140265760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613fda57613fda613ef9565b8086168614613feb57613feb613ef9565b5060008360005260206000208360011b81018760011b820191505b80821015614021578282558284830155600282019150614006565b505050505b5060008181526020812083915b85811015613dd7576140458383613f28565b6040929092019160029190910190600101614033565b813581556001810160208301356140718161336e565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556140b16040860186613b1a565b935091506140c3838360028701613ddf565b6140d06060860186613b1a565b935091506140e2838360038701613ddf565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261411957600080fd5b91840191823591508082111561412e57600080fd5b506020820191508060061b360382131561414757600080fd5b611c10818360048601613f80565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613b1057600080fd5b80151581146123c757600080fd5b6000602082840312156141a957600080fd5b81356123d681614189565b60208152600061269b602083018486613be3565b60008251613b10818460208701613426565b6000602082840312156141ec57600080fd5b813567ffffffffffffffff8082111561420457600080fd5b908301906060828603121561421857600080fd5b61422061382f565b82358281111561422f57600080fd5b61423b878286016138e7565b82525060208301358281111561425057600080fd5b61425c878286016138e7565b602083015250604083013592506002831061427657600080fd5b6040810192909252509392505050565b6000806040838503121561429957600080fd5b825167ffffffffffffffff8111156142b057600080fd5b8301601f810185136142c157600080fd5b80516142cf613906826138a1565b8181528660208385010111156142e457600080fd5b6142f5826020830160208601613426565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a0604084015261433360e084018261344a565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261436f838361344a565b9250604086015191508085840301608086015261438c8383613551565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143ca828261344a565b9695505050505050565b6000602082840312156143e657600080fd5b5051919050565b8082018082111561068c5761068c613ef9565b604081526000614413604083018561344a565b90508260208301529392505050565b60006020828403121561443457600080fd5b81516123d68161418956fea164736f6c6343000818000a", +} + +var CCIPClientWithACKABI = CCIPClientWithACKMetaData.ABI + +var CCIPClientWithACKBin = CCIPClientWithACKMetaData.Bin + +func DeployCCIPClientWithACK(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address) (common.Address, *types.Transaction, *CCIPClientWithACK, error) { + parsed, err := CCIPClientWithACKMetaData.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(CCIPClientWithACKBin), backend, router, feeToken) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPClientWithACK{address: address, abi: *parsed, CCIPClientWithACKCaller: CCIPClientWithACKCaller{contract: contract}, CCIPClientWithACKTransactor: CCIPClientWithACKTransactor{contract: contract}, CCIPClientWithACKFilterer: CCIPClientWithACKFilterer{contract: contract}}, nil +} + +type CCIPClientWithACK struct { + address common.Address + abi abi.ABI + CCIPClientWithACKCaller + CCIPClientWithACKTransactor + CCIPClientWithACKFilterer +} + +type CCIPClientWithACKCaller struct { + contract *bind.BoundContract +} + +type CCIPClientWithACKTransactor struct { + contract *bind.BoundContract +} + +type CCIPClientWithACKFilterer struct { + contract *bind.BoundContract +} + +type CCIPClientWithACKSession struct { + Contract *CCIPClientWithACK + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPClientWithACKCallerSession struct { + Contract *CCIPClientWithACKCaller + CallOpts bind.CallOpts +} + +type CCIPClientWithACKTransactorSession struct { + Contract *CCIPClientWithACKTransactor + TransactOpts bind.TransactOpts +} + +type CCIPClientWithACKRaw struct { + Contract *CCIPClientWithACK +} + +type CCIPClientWithACKCallerRaw struct { + Contract *CCIPClientWithACKCaller +} + +type CCIPClientWithACKTransactorRaw struct { + Contract *CCIPClientWithACKTransactor +} + +func NewCCIPClientWithACK(address common.Address, backend bind.ContractBackend) (*CCIPClientWithACK, error) { + abi, err := abi.JSON(strings.NewReader(CCIPClientWithACKABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPClientWithACK(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPClientWithACK{address: address, abi: abi, CCIPClientWithACKCaller: CCIPClientWithACKCaller{contract: contract}, CCIPClientWithACKTransactor: CCIPClientWithACKTransactor{contract: contract}, CCIPClientWithACKFilterer: CCIPClientWithACKFilterer{contract: contract}}, nil +} + +func NewCCIPClientWithACKCaller(address common.Address, caller bind.ContractCaller) (*CCIPClientWithACKCaller, error) { + contract, err := bindCCIPClientWithACK(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPClientWithACKCaller{contract: contract}, nil +} + +func NewCCIPClientWithACKTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPClientWithACKTransactor, error) { + contract, err := bindCCIPClientWithACK(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPClientWithACKTransactor{contract: contract}, nil +} + +func NewCCIPClientWithACKFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPClientWithACKFilterer, error) { + contract, err := bindCCIPClientWithACK(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPClientWithACKFilterer{contract: contract}, nil +} + +func bindCCIPClientWithACK(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPClientWithACKMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPClientWithACK.Contract.CCIPClientWithACKCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPClientWithACK *CCIPClientWithACKRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.CCIPClientWithACKTransactor.contract.Transfer(opts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.CCIPClientWithACKTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPClientWithACK.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.contract.Transfer(opts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPClientWithACK.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) ACKMESSAGEHEADER() (string, error) { + return _CCIPClientWithACK.Contract.ACKMESSAGEHEADER(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) ACKMESSAGEHEADER() (string, error) { + return _CCIPClientWithACK.Contract.ACKMESSAGEHEADER(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPClientWithACK.Contract.GetMessageContents(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPClientWithACK.Contract.GetMessageContents(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPClientWithACK.Contract.GetMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { + return _CCIPClientWithACK.Contract.GetMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) GetRouter() (common.Address, error) { + return _CCIPClientWithACK.Contract.GetRouter(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetRouter() (common.Address, error) { + return _CCIPClientWithACK.Contract.GetRouter(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPClientWithACK.Contract.IsApprovedSender(&_CCIPClientWithACK.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { + return _CCIPClientWithACK.Contract.IsApprovedSender(&_CCIPClientWithACK.CallOpts, sourceChainSelector, senderAddr) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) Owner() (common.Address, error) { + return _CCIPClientWithACK.Contract.Owner(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) Owner() (common.Address, error) { + return _CCIPClientWithACK.Contract.Owner(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, + + error) { + var out []interface{} + err := _CCIPClientWithACK.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) + + 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) + + return *outstruct, err + +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, + + error) { + return _CCIPClientWithACK.Contract.SChainConfigs(&_CCIPClientWithACK.CallOpts, destChainSelector) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, + + error) { + return _CCIPClientWithACK.Contract.SChainConfigs(&_CCIPClientWithACK.CallOpts, destChainSelector) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) SFeeToken() (common.Address, error) { + return _CCIPClientWithACK.Contract.SFeeToken(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SFeeToken() (common.Address, error) { + return _CCIPClientWithACK.Contract.SFeeToken(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { + var out []interface{} + err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.AbandonFailedMessage(&_CCIPClientWithACK.TransactOpts, messageId, receiver) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.AbandonFailedMessage(&_CCIPClientWithACK.TransactOpts, messageId, receiver) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.AcceptOwnership(&_CCIPClientWithACK.TransactOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.AcceptOwnership(&_CCIPClientWithACK.TransactOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "applyChainUpdates", chains) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.ApplyChainUpdates(&_CCIPClientWithACK.TransactOpts, chains) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.ApplyChainUpdates(&_CCIPClientWithACK.TransactOpts, chains) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "ccipReceive", message) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.CcipReceive(&_CCIPClientWithACK.TransactOpts, message) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.CcipReceive(&_CCIPClientWithACK.TransactOpts, message) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "ccipSend", destChainSelector, tokenAmounts, data) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.CcipSend(&_CCIPClientWithACK.TransactOpts, destChainSelector, tokenAmounts, data) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) CcipSend(destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.CcipSend(&_CCIPClientWithACK.TransactOpts, destChainSelector, tokenAmounts, data) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "processMessage", message) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.ProcessMessage(&_CCIPClientWithACK.TransactOpts, message) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.ProcessMessage(&_CCIPClientWithACK.TransactOpts, message) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "retryFailedMessage", messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.RetryFailedMessage(&_CCIPClientWithACK.TransactOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.RetryFailedMessage(&_CCIPClientWithACK.TransactOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.TransferOwnership(&_CCIPClientWithACK.TransactOpts, to) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.TransferOwnership(&_CCIPClientWithACK.TransactOpts, to) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdateApprovedSenders(&_CCIPClientWithACK.TransactOpts, adds, removes) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdateApprovedSenders(&_CCIPClientWithACK.TransactOpts, adds, removes) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "updateFeeToken", token) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdateFeeToken(&_CCIPClientWithACK.TransactOpts, token) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdateFeeToken(&_CCIPClientWithACK.TransactOpts, token) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdateRouter(&_CCIPClientWithACK.TransactOpts, newRouter) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdateRouter(&_CCIPClientWithACK.TransactOpts, newRouter) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "withdrawNativeToken", to, amount) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.WithdrawNativeToken(&_CCIPClientWithACK.TransactOpts, to, amount) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.WithdrawNativeToken(&_CCIPClientWithACK.TransactOpts, to, amount) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "withdrawTokens", token, to, amount) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.WithdrawTokens(&_CCIPClientWithACK.TransactOpts, token, to, amount) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) WithdrawTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.WithdrawTokens(&_CCIPClientWithACK.TransactOpts, token, to, amount) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.RawTransact(opts, nil) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) Receive() (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.Receive(&_CCIPClientWithACK.TransactOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) Receive() (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.Receive(&_CCIPClientWithACK.TransactOpts) +} + +type CCIPClientWithACKApprovedSenderAddedIterator struct { + Event *CCIPClientWithACKApprovedSenderAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKApprovedSenderAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKApprovedSenderAdded) + 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(CCIPClientWithACKApprovedSenderAdded) + 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 *CCIPClientWithACKApprovedSenderAddedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKApprovedSenderAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKApprovedSenderAdded struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientWithACKApprovedSenderAddedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKApprovedSenderAddedIterator{contract: _CCIPClientWithACK.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientWithACKApprovedSenderAdded) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ApprovedSenderAdded", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseApprovedSenderAdded(log types.Log) (*CCIPClientWithACKApprovedSenderAdded, error) { + event := new(CCIPClientWithACKApprovedSenderAdded) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKApprovedSenderRemovedIterator struct { + Event *CCIPClientWithACKApprovedSenderRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKApprovedSenderRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKApprovedSenderRemoved) + 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(CCIPClientWithACKApprovedSenderRemoved) + 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 *CCIPClientWithACKApprovedSenderRemovedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKApprovedSenderRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKApprovedSenderRemoved struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientWithACKApprovedSenderRemovedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKApprovedSenderRemovedIterator{contract: _CCIPClientWithACK.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientWithACKApprovedSenderRemoved) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ApprovedSenderRemoved", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseApprovedSenderRemoved(log types.Log) (*CCIPClientWithACKApprovedSenderRemoved, error) { + event := new(CCIPClientWithACKApprovedSenderRemoved) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKCCIPRouterModifiedIterator struct { + Event *CCIPClientWithACKCCIPRouterModified + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKCCIPRouterModifiedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKCCIPRouterModified) + 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(CCIPClientWithACKCCIPRouterModified) + 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 *CCIPClientWithACKCCIPRouterModifiedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKCCIPRouterModifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientWithACKCCIPRouterModifiedIterator, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKCCIPRouterModifiedIterator{contract: _CCIPClientWithACK.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientWithACKCCIPRouterModified) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "CCIPRouterModified", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseCCIPRouterModified(log types.Log) (*CCIPClientWithACKCCIPRouterModified, error) { + event := new(CCIPClientWithACKCCIPRouterModified) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKChainAddedIterator struct { + Event *CCIPClientWithACKChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKChainAdded) + 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(CCIPClientWithACKChainAdded) + 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 *CCIPClientWithACKChainAddedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKChainAdded struct { + RemoteChainSelector uint64 + Recipient common.Hash + ExtraArgsBytes []byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPClientWithACKChainAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKChainAddedIterator{contract: _CCIPClientWithACK.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientWithACKChainAdded) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseChainAdded(log types.Log) (*CCIPClientWithACKChainAdded, error) { + event := new(CCIPClientWithACKChainAdded) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKChainRemovedIterator struct { + Event *CCIPClientWithACKChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKChainRemoved) + 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(CCIPClientWithACKChainRemoved) + 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 *CCIPClientWithACKChainRemovedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPClientWithACKChainRemovedIterator, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKChainRemovedIterator{contract: _CCIPClientWithACK.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { + + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientWithACKChainRemoved) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseChainRemoved(log types.Log) (*CCIPClientWithACKChainRemoved, error) { + event := new(CCIPClientWithACKChainRemoved) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKFeeTokenUpdatedIterator struct { + Event *CCIPClientWithACKFeeTokenUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKFeeTokenUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKFeeTokenUpdated) + 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(CCIPClientWithACKFeeTokenUpdated) + 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 *CCIPClientWithACKFeeTokenUpdatedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKFeeTokenUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKFeeTokenUpdated struct { + OldToken common.Address + NewToken common.Address + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPClientWithACKFeeTokenUpdatedIterator, 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 := _CCIPClientWithACK.contract.FilterLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKFeeTokenUpdatedIterator{contract: _CCIPClientWithACK.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKFeeTokenUpdated, 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 := _CCIPClientWithACK.contract.WatchLogs(opts, "FeeTokenUpdated", 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(CCIPClientWithACKFeeTokenUpdated) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "FeeTokenUpdated", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseFeeTokenUpdated(log types.Log) (*CCIPClientWithACKFeeTokenUpdated, error) { + event := new(CCIPClientWithACKFeeTokenUpdated) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageAbandonedIterator struct { + Event *CCIPClientWithACKMessageAbandoned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageAbandonedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageAbandoned) + 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(CCIPClientWithACKMessageAbandoned) + 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 *CCIPClientWithACKMessageAbandonedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageAbandonedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageAbandonedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageAbandonedIterator{contract: _CCIPClientWithACK.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.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(CCIPClientWithACKMessageAbandoned) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageAbandoned(log types.Log) (*CCIPClientWithACKMessageAbandoned, error) { + event := new(CCIPClientWithACKMessageAbandoned) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageAckReceivedIterator struct { + Event *CCIPClientWithACKMessageAckReceived + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageAckReceivedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageAckReceived) + 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(CCIPClientWithACKMessageAckReceived) + 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 *CCIPClientWithACKMessageAckReceivedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageAckReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageAckReceived struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPClientWithACKMessageAckReceivedIterator, error) { + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageAckReceived") + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageAckReceivedIterator{contract: _CCIPClientWithACK.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageAckReceived) (event.Subscription, error) { + + logs, sub, err := _CCIPClientWithACK.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(CCIPClientWithACKMessageAckReceived) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageAckReceived(log types.Log) (*CCIPClientWithACKMessageAckReceived, error) { + event := new(CCIPClientWithACKMessageAckReceived) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageAckSentIterator struct { + Event *CCIPClientWithACKMessageAckSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageAckSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageAckSent) + 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(CCIPClientWithACKMessageAckSent) + 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 *CCIPClientWithACKMessageAckSentIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageAckSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageAckSent struct { + IncomingMessageId [32]byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPClientWithACKMessageAckSentIterator, error) { + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageAckSent") + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageAckSentIterator{contract: _CCIPClientWithACK.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageAckSent) (event.Subscription, error) { + + logs, sub, err := _CCIPClientWithACK.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(CCIPClientWithACKMessageAckSent) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageAckSent(log types.Log) (*CCIPClientWithACKMessageAckSent, error) { + event := new(CCIPClientWithACKMessageAckSent) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageAckSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageFailedIterator struct { + Event *CCIPClientWithACKMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageFailedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageFailed) + 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(CCIPClientWithACKMessageFailed) + 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 *CCIPClientWithACKMessageFailedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageFailedIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageFailedIterator{contract: _CCIPClientWithACK.contract, event: "MessageFailed", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageFailed, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.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(CCIPClientWithACKMessageFailed) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageFailed(log types.Log) (*CCIPClientWithACKMessageFailed, error) { + event := new(CCIPClientWithACKMessageFailed) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageRecoveredIterator struct { + Event *CCIPClientWithACKMessageRecovered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageRecoveredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageRecovered) + 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(CCIPClientWithACKMessageRecovered) + 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 *CCIPClientWithACKMessageRecoveredIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageRecovered struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageRecoveredIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageRecoveredIterator{contract: _CCIPClientWithACK.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageRecovered, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.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(CCIPClientWithACKMessageRecovered) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageRecovered(log types.Log) (*CCIPClientWithACKMessageRecovered, error) { + event := new(CCIPClientWithACKMessageRecovered) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageSentIterator struct { + Event *CCIPClientWithACKMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageSent) + 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(CCIPClientWithACKMessageSent) + 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 *CCIPClientWithACKMessageSentIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageSent struct { + IncomingMessageId [32]byte + ACKMessageId [32]byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPClientWithACKMessageSentIterator, 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 := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageSentIterator{contract: _CCIPClientWithACK.contract, event: "MessageSent", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageSent, 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 := _CCIPClientWithACK.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(CCIPClientWithACKMessageSent) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageSent(log types.Log) (*CCIPClientWithACKMessageSent, error) { + event := new(CCIPClientWithACKMessageSent) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKMessageSucceededIterator struct { + Event *CCIPClientWithACKMessageSucceeded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKMessageSucceededIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKMessageSucceeded) + 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(CCIPClientWithACKMessageSucceeded) + 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 *CCIPClientWithACKMessageSucceededIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKMessageSucceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKMessageSucceeded struct { + MessageId [32]byte + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageSucceededIterator, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKMessageSucceededIterator{contract: _CCIPClientWithACK.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { + + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPClientWithACK.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(CCIPClientWithACKMessageSucceeded) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseMessageSucceeded(log types.Log) (*CCIPClientWithACKMessageSucceeded, error) { + event := new(CCIPClientWithACKMessageSucceeded) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKOwnershipTransferRequestedIterator struct { + Event *CCIPClientWithACKOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKOwnershipTransferRequested) + 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(CCIPClientWithACKOwnershipTransferRequested) + 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 *CCIPClientWithACKOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientWithACKOwnershipTransferRequestedIterator, 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 := _CCIPClientWithACK.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKOwnershipTransferRequestedIterator{contract: _CCIPClientWithACK.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKOwnershipTransferRequested, 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 := _CCIPClientWithACK.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(CCIPClientWithACKOwnershipTransferRequested) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPClientWithACKOwnershipTransferRequested, error) { + event := new(CCIPClientWithACKOwnershipTransferRequested) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKOwnershipTransferredIterator struct { + Event *CCIPClientWithACKOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKOwnershipTransferred) + 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(CCIPClientWithACKOwnershipTransferred) + 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 *CCIPClientWithACKOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientWithACKOwnershipTransferredIterator, 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 := _CCIPClientWithACK.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKOwnershipTransferredIterator{contract: _CCIPClientWithACK.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKOwnershipTransferred, 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 := _CCIPClientWithACK.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(CCIPClientWithACKOwnershipTransferred) + if err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPClientWithACKOwnershipTransferred, error) { + event := new(CCIPClientWithACKOwnershipTransferred) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPClientWithACKTokensWithdrawnByOwnerIterator struct { + Event *CCIPClientWithACKTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKTokensWithdrawnByOwner) + 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(CCIPClientWithACKTokensWithdrawnByOwner) + 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 *CCIPClientWithACKTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientWithACKTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &CCIPClientWithACKTokensWithdrawnByOwnerIterator{contract: _CCIPClientWithACK.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(CCIPClientWithACKTokensWithdrawnByOwner) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseTokensWithdrawnByOwner(log types.Log) (*CCIPClientWithACKTokensWithdrawnByOwner, error) { + event := new(CCIPClientWithACKTokensWithdrawnByOwner) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChainConfigs struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPClientWithACK *CCIPClientWithACK) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPClientWithACK.abi.Events["ApprovedSenderAdded"].ID: + return _CCIPClientWithACK.ParseApprovedSenderAdded(log) + case _CCIPClientWithACK.abi.Events["ApprovedSenderRemoved"].ID: + return _CCIPClientWithACK.ParseApprovedSenderRemoved(log) + case _CCIPClientWithACK.abi.Events["CCIPRouterModified"].ID: + return _CCIPClientWithACK.ParseCCIPRouterModified(log) + case _CCIPClientWithACK.abi.Events["ChainAdded"].ID: + return _CCIPClientWithACK.ParseChainAdded(log) + case _CCIPClientWithACK.abi.Events["ChainRemoved"].ID: + return _CCIPClientWithACK.ParseChainRemoved(log) + case _CCIPClientWithACK.abi.Events["FeeTokenUpdated"].ID: + return _CCIPClientWithACK.ParseFeeTokenUpdated(log) + case _CCIPClientWithACK.abi.Events["MessageAbandoned"].ID: + return _CCIPClientWithACK.ParseMessageAbandoned(log) + case _CCIPClientWithACK.abi.Events["MessageAckReceived"].ID: + return _CCIPClientWithACK.ParseMessageAckReceived(log) + case _CCIPClientWithACK.abi.Events["MessageAckSent"].ID: + return _CCIPClientWithACK.ParseMessageAckSent(log) + case _CCIPClientWithACK.abi.Events["MessageFailed"].ID: + return _CCIPClientWithACK.ParseMessageFailed(log) + case _CCIPClientWithACK.abi.Events["MessageRecovered"].ID: + return _CCIPClientWithACK.ParseMessageRecovered(log) + case _CCIPClientWithACK.abi.Events["MessageSent"].ID: + return _CCIPClientWithACK.ParseMessageSent(log) + case _CCIPClientWithACK.abi.Events["MessageSucceeded"].ID: + return _CCIPClientWithACK.ParseMessageSucceeded(log) + case _CCIPClientWithACK.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPClientWithACK.ParseOwnershipTransferRequested(log) + case _CCIPClientWithACK.abi.Events["OwnershipTransferred"].ID: + return _CCIPClientWithACK.ParseOwnershipTransferred(log) + case _CCIPClientWithACK.abi.Events["TokensWithdrawnByOwner"].ID: + return _CCIPClientWithACK.ParseTokensWithdrawnByOwner(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPClientWithACKApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (CCIPClientWithACKApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") +} + +func (CCIPClientWithACKCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (CCIPClientWithACKChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (CCIPClientWithACKChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (CCIPClientWithACKFeeTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67") +} + +func (CCIPClientWithACKMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + +func (CCIPClientWithACKMessageAckReceived) Topic() common.Hash { + return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") +} + +func (CCIPClientWithACKMessageAckSent) Topic() common.Hash { + return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") +} + +func (CCIPClientWithACKMessageFailed) Topic() common.Hash { + return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") +} + +func (CCIPClientWithACKMessageRecovered) Topic() common.Hash { + return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +} + +func (CCIPClientWithACKMessageSent) Topic() common.Hash { + return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") +} + +func (CCIPClientWithACKMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + +func (CCIPClientWithACKOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPClientWithACKOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (CCIPClientWithACKTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + +func (_CCIPClientWithACK *CCIPClientWithACK) Address() common.Address { + return _CCIPClientWithACK.address +} + +type CCIPClientWithACKInterface interface { + ACKMESSAGEHEADER(opts *bind.CallOpts) (string, 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) + + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, + + error) + + SFeeToken(opts *bind.CallOpts) (common.Address, error) + + SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) + + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) + + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + CcipSend(opts *bind.TransactOpts, destChainSelector uint64, tokenAmounts []ClientEVMTokenAmount, data []byte) (*types.Transaction, error) + + ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*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 []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + + UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientWithACKApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*CCIPClientWithACKApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPClientWithACKApprovedSenderRemovedIterator, error) + + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderRemoved(log types.Log) (*CCIPClientWithACKApprovedSenderRemoved, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPClientWithACKCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*CCIPClientWithACKCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPClientWithACKChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*CCIPClientWithACKChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPClientWithACKChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKChainRemoved, removeChainSelector []uint64) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*CCIPClientWithACKChainRemoved, error) + + FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPClientWithACKFeeTokenUpdatedIterator, error) + + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + + ParseFeeTokenUpdated(log types.Log) (*CCIPClientWithACKFeeTokenUpdated, error) + + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageAbandonedIterator, error) + + WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageAbandoned, messageId [][32]byte) (event.Subscription, error) + + ParseMessageAbandoned(log types.Log) (*CCIPClientWithACKMessageAbandoned, error) + + FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPClientWithACKMessageAckReceivedIterator, error) + + WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageAckReceived) (event.Subscription, error) + + ParseMessageAckReceived(log types.Log) (*CCIPClientWithACKMessageAckReceived, error) + + FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPClientWithACKMessageAckSentIterator, error) + + WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageAckSent) (event.Subscription, error) + + ParseMessageAckSent(log types.Log) (*CCIPClientWithACKMessageAckSent, error) + + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageFailedIterator, error) + + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageFailed, messageId [][32]byte) (event.Subscription, error) + + ParseMessageFailed(log types.Log) (*CCIPClientWithACKMessageFailed, error) + + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageRecoveredIterator, error) + + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageRecovered, messageId [][32]byte) (event.Subscription, error) + + ParseMessageRecovered(log types.Log) (*CCIPClientWithACKMessageRecovered, error) + + FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPClientWithACKMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + + ParseMessageSent(log types.Log) (*CCIPClientWithACKMessageSent, error) + + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPClientWithACKMessageSucceededIterator, error) + + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + + ParseMessageSucceeded(log types.Log) (*CCIPClientWithACKMessageSucceeded, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientWithACKOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPClientWithACKOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPClientWithACKOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPClientWithACKOwnershipTransferred, error) + + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientWithACKTokensWithdrawnByOwnerIterator, error) + + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokensWithdrawnByOwner(log types.Log) (*CCIPClientWithACKTokensWithdrawnByOwner, 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 index f695b20319..9471551845 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go +++ b/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package ccipReceiverWithAck +package ccipReceiverWithACK import ( "errors" @@ -30,6 +30,18 @@ var ( _ = abi.ConvertType ) +type CCIPBaseApprovedSenderUpdate struct { + DestChainSelector uint64 + Sender []byte +} + +type CCIPBaseChainUpdate struct { + ChainSelector uint64 + Allowed bool + Recipient []byte + ExtraArgsBytes []byte +} + type ClientAny2EVMMessage struct { MessageId [32]byte SourceChainSelector uint64 @@ -43,22 +55,17 @@ type ClientEVMTokenAmount struct { 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 CCIPReceiverWithACKMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200440438038062004404833981016040819052620000349162000565565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000141565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013957620001396001600160a01b03821683600019620001ec565b50506200068a565b336001600160a01b038216036200019b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002649190620005a4565b620002709190620005be565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cc91869190620002d216565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000321906001600160a01b038516908490620003a8565b805190915015620003a35780806020019051810190620003429190620005e6565b620003a35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b505050565b6060620003b98484600085620003c1565b949350505050565b606082471015620004245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000442919062000637565b60006040518083038185875af1925050503d806000811462000481576040519150601f19603f3d011682016040523d82523d6000602084013e62000486565b606091505b5090925090506200049a87838387620004a5565b979650505050505050565b606083156200051957825160000362000511576001600160a01b0385163b620005115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b5081620003b9565b620003b98383815115620005305781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000655565b6001600160a01b03811681146200056257600080fd5b50565b600080604083850312156200057957600080fd5b825162000586816200054c565b602084015190925062000599816200054c565b809150509250929050565b600060208284031215620005b757600080fd5b5051919050565b80820180821115620005e057634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f957600080fd5b815180151581146200060a57600080fd5b9392505050565b60005b838110156200062e57818101518382015260200162000614565b50506000910152565b600082516200064b81846020870162000611565b9190910192915050565b60208152600082518060208401526200067681604085016020870162000611565b601f01601f19169190910160400192915050565b613d6a806200069a6000396000f3fe60806040526004361061016e5760003560e01c80638462a2b9116100cb578063c851cc321161007f578063e4ca875411610059578063e4ca87541461047d578063f2fde38b1461049d578063ff2deec3146104bd57600080fd5b8063c851cc321461041d578063c89245d51461043d578063cf6730f81461045d57600080fd5b80638da5cb5b116100b05780638da5cb5b146103865780639fe74e26146103d2578063b0f479a1146103f257600080fd5b80638462a2b91461034657806385572ffb1461036657600080fd5b80635e35359e116101225780636d62d633116101075780636d62d633146102bb5780636fef519e146102db57806379ba50971461033157600080fd5b80635e35359e1461026e5780636939cd971461028e57600080fd5b806335f170ef1161015357806335f170ef146101f05780635075a9d41461021e578063536c6bfa1461024c57600080fd5b806305bfe9821461017a5780630e958d6b146101c057600080fd5b3661017557005b600080fd5b34801561018657600080fd5b506101aa610195366004612d33565b60096020526000908152604090205460ff1681565b6040516101b79190612d7b565b60405180910390f35b3480156101cc57600080fd5b506101e06101db366004612dd2565b6104ea565b60405190151581526020016101b7565b3480156101fc57600080fd5b5061021061020b366004612e57565b610535565b6040516101b7929190612ee2565b34801561022a57600080fd5b5061023e610239366004612d33565b610661565b6040519081526020016101b7565b34801561025857600080fd5b5061026c610267366004612f32565b610674565b005b34801561027a57600080fd5b5061026c610289366004612f5e565b6106d8565b34801561029a57600080fd5b506102ae6102a9366004612d33565b61076d565b6040516101b79190612ffc565b3480156102c757600080fd5b5061026c6102d6366004613090565b610978565b3480156102e757600080fd5b506103246040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101b791906130c0565b34801561033d57600080fd5b5061026c610c92565b34801561035257600080fd5b5061026c61036136600461311f565b610d8f565b34801561037257600080fd5b5061026c61038136600461318b565b6110d0565b34801561039257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b3480156103de57600080fd5b5061026c6103ed3660046131c6565b6112d9565b3480156103fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103ad565b34801561042957600080fd5b5061026c610438366004613208565b61166a565b34801561044957600080fd5b5061026c610458366004613208565b611736565b34801561046957600080fd5b5061026c61047836600461318b565b6118aa565b34801561048957600080fd5b5061026c610498366004612d33565b611bf8565b3480156104a957600080fd5b5061026c6104b8366004613208565b611e62565b3480156104c957600080fd5b506008546103ad9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105199085908590613225565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061055090613235565b80601f016020809104026020016040519081016040528092919081815260200182805461057c90613235565b80156105c95780601f1061059e576101008083540402835291602001916105c9565b820191906000526020600020905b8154815290600101906020018083116105ac57829003601f168201915b5050505050908060010180546105de90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461060a90613235565b80156106575780601f1061062c57610100808354040283529160200191610657565b820191906000526020600020905b81548152906001019060200180831161063a57829003601f168201915b5050505050905082565b600061066e600583611e76565b92915050565b61067c611e89565b6106868282611f0c565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6106e0611e89565b61070173ffffffffffffffffffffffffffffffffffffffff84168383612066565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161076091815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107dc90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461080890613235565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050815260200160038201805461086e90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461089a90613235565b80156108e75780601f106108bc576101008083540402835291602001916108e7565b820191906000526020600020905b8154815290600101906020018083116108ca57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561096a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610915565b505050915250909392505050565b610980611e89565b600161098d600584611e76565b146109cc576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109dc8260025b6005919061213a565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610a2490613235565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090613235565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b50505050508152602001600382018054610ab690613235565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290613235565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bb25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b5d565b5050505081525050905060005b816080015151811015610c4157610c398383608001518381518110610be657610be6613288565b60200260200101516020015184608001518481518110610c0857610c08613288565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166120669092919063ffffffff16565b600101610bbf565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109c3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d97611e89565b60005b81811015610f2a5760036000848484818110610db857610db8613288565b9050602002810190610dca91906132b7565b610dd8906020810190612e57565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e0f57610e0f613288565b9050602002810190610e2191906132b7565b610e2f9060208101906132f5565b604051610e3d929190613225565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610e8457610e84613288565b9050602002810190610e9691906132b7565b610ea49060208101906132f5565b604051610eb2929190613225565b6040518091039020838383818110610ecc57610ecc613288565b9050602002810190610ede91906132b7565b610eec906020810190612e57565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d9a565b5060005b838110156110c957600160036000878785818110610f4e57610f4e613288565b9050602002810190610f6091906132b7565b610f6e906020810190612e57565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fa557610fa5613288565b9050602002810190610fb791906132b7565b610fc59060208101906132f5565b604051610fd3929190613225565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061102357611023613288565b905060200281019061103591906132b7565b6110439060208101906132f5565b604051611051929190613225565b604051809103902085858381811061106b5761106b613288565b905060200281019061107d91906132b7565b61108b906020810190612e57565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f2e565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611123576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109c3565b6111336040820160208301612e57565b67ffffffffffffffff811660009081526003602052604090208054819061115990613235565b90506000036111a0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109c3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906111dc90869060040161345c565b600060405180830381600087803b1580156111f657600080fd5b505af1925050508015611207575060015b6112a7573d808015611235576040519150601f19603f3d011682016040523d82523d6000602084013e61123a565b606091505b50611247843560016109d3565b508335600090815260046020526040902084906112648282613865565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112999084906130c0565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6112e1611e89565b60005b818110156112d4578282828181106112fe576112fe613288565b9050602002810190611310919061395f565b6113219060408101906020016139a1565b6113ed576003600084848481811061133b5761133b613288565b905060200281019061134d919061395f565b61135b906020810190612e57565b67ffffffffffffffff1681526020810191909152604001600090812061138091612ce5565b82828281811061139257611392613288565b90506020028101906113a4919061395f565b6113b2906020810190612e57565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611662565b8282828181106113ff576113ff613288565b9050602002810190611411919061395f565b61141f9060408101906132f5565b905060000361145a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061147257611472613288565b9050602002810190611484919061395f565b611492906020810190612e57565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106114c8576114c8613288565b90506020028101906114da919061395f565b6114e89060408101906132f5565b82916114f59190836135e9565b5083838381811061150857611508613288565b905060200281019061151a919061395f565b6115289060608101906132f5565b1590506115735783838381811061154157611541613288565b9050602002810190611553919061395f565b6115619060608101906132f5565b60018301916115719190836135e9565b505b83838381811061158557611585613288565b9050602002810190611597919061395f565b6115a59060408101906132f5565b6040516115b3929190613225565b60405180910390208484848181106115cd576115cd613288565b90506020028101906115df919061395f565b6115ed906020810190612e57565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061162a5761162a613288565b905060200281019061163c919061395f565b61164a9060608101906132f5565b6040516116589291906139be565b60405180910390a3505b6001016112e4565b611672611e89565b73ffffffffffffffffffffffffffffffffffffffff81166116bf576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61173e611e89565b60085473ffffffffffffffffffffffffffffffffffffffff161561179f5761179f61177e60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff1690600061214f565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561184c5761184c61180c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122d1565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146118e3576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118f36040820160208301612e57565b61190060408301836132f5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061195792509050613235565b159050806119ad5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161199891906139d2565b9081526040519081900360200190205460ff16155b156119e657806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109c391906130c0565b60006119f560608501856132f5565b810190611a029190613af8565b9050600081604001516001811115611a1c57611a1c612d4c565b03611a2f57611a2a846123cf565b611bf2565b600181604001516001811115611a4757611a47612d4c565b03611bf2576000808260200151806020019051810190611a679190613ba4565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611ab191906130c0565b6040516020818303038152906040528051906020012082604051602001611ad891906130c0565b6040516020818303038152906040528051906020012014611b25576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526009602052604090205460ff166002811115611b4a57611b4a612d4c565b03611b84576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109c3565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505b50505050565b6001611c05600583611e76565b14611c3f576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109c3565b611c4a8160006109d3565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611c9290613235565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbe90613235565b8015611d0b5780601f10611ce057610100808354040283529160200191611d0b565b820191906000526020600020905b815481529060010190602001808311611cee57829003601f168201915b50505050508152602001600382018054611d2490613235565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5090613235565b8015611d9d5780601f10611d7257610100808354040283529160200191611d9d565b820191906000526020600020905b815481529060010190602001808311611d8057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e205760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611dcb565b50505050815250509050611e3381612745565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611e6a611e89565b611e73816127b7565b50565b6000611e8283836128ac565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109c3565b565b80471015611f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109c3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fd0576040519150601f19603f3d011682016040523d82523d6000602084013e611fd5565b606091505b50509050806112d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109c3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112d49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612936565b6000612147848484612a42565b949350505050565b8015806121ef57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ed9190613c25565b155b61227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109c3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112d49084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120b8565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190613c25565b6123769190613c3e565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611bf29085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120b8565b604080516000808252602082019092528161240c565b60408051808201909152600080825260208201528152602001906001900390816123e55790505b50905060006040518060a0016040528084806040019061242c91906132f5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124ad9288359101613c51565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff168383015260609092019160039160009161251d918901908901612e57565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461254d90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461257990613235565b80156125c65780601f1061259b576101008083540402835291602001916125c6565b820191906000526020600020905b8154815290600101906020018083116125a957829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded6126036040870160208801612e57565b846040518363ffffffff1660e01b8152600401612621929190613c73565b602060405180830381865afa15801561263e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126629190613c25565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561269a57600061269c565b835b6126ac6040890160208a01612e57565b866040518463ffffffff1660e01b81526004016126ca929190613c73565b60206040518083038185885af11580156126e8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061270d9190613c25565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b61274d611e89565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612789908490600401612ffc565b600060405180830381600087803b1580156127a357600080fd5b505af11580156110c9573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109c3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806128d057506128d08484612a5f565b611e82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109c3565b6000612998826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a6b9092919063ffffffff16565b8051909150156112d457808060200190518101906129b69190613d40565b6112d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109c3565b600082815260028401602052604081208290556121478484612a7a565b6000611e828383612a86565b60606121478484600085612a9e565b6000611e828383612bb7565b60008181526001830160205260408120541515611e82565b606082471015612b30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109c3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b5991906139d2565b60006040518083038185875af1925050503d8060008114612b96576040519150601f19603f3d011682016040523d82523d6000602084013e612b9b565b606091505b5091509150612bac87838387612c06565b979650505050505050565b6000818152600183016020526040812054612bfe5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561066e565b50600061066e565b60608315612c9c578251600003612c955773ffffffffffffffffffffffffffffffffffffffff85163b612c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109c3565b5081612147565b6121478383815115612cb15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c391906130c0565b508054612cf190613235565b6000825580601f10612d01575050565b601f016020900490600052602060002090810190611e7391905b80821115612d2f5760008155600101612d1b565b5090565b600060208284031215612d4557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e7357600080fd5b600080600060408486031215612de757600080fd5b8335612df281612dbc565b9250602084013567ffffffffffffffff80821115612e0f57600080fd5b818601915086601f830112612e2357600080fd5b813581811115612e3257600080fd5b876020828501011115612e4457600080fd5b6020830194508093505050509250925092565b600060208284031215612e6957600080fd5b8135611e8281612dbc565b60005b83811015612e8f578181015183820152602001612e77565b50506000910152565b60008151808452612eb0816020860160208601612e74565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612ef56040830185612e98565b8281036020840152612f078185612e98565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e7357600080fd5b60008060408385031215612f4557600080fd5b8235612f5081612f10565b946020939093013593505050565b600080600060608486031215612f7357600080fd5b8335612f7e81612f10565b92506020840135612f8e81612f10565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612ff1578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fb4565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303660c0840182612e98565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130728383612e98565b925060808601519150808584030160a086015250612f078282612f9f565b600080604083850312156130a357600080fd5b8235915060208301356130b581612f10565b809150509250929050565b602081526000611e826020830184612e98565b60008083601f8401126130e557600080fd5b50813567ffffffffffffffff8111156130fd57600080fd5b6020830191508360208260051b850101111561311857600080fd5b9250929050565b6000806000806040858703121561313557600080fd5b843567ffffffffffffffff8082111561314d57600080fd5b613159888389016130d3565b9096509450602087013591508082111561317257600080fd5b5061317f878288016130d3565b95989497509550505050565b60006020828403121561319d57600080fd5b813567ffffffffffffffff8111156131b457600080fd5b820160a08185031215611e8257600080fd5b600080602083850312156131d957600080fd5b823567ffffffffffffffff8111156131f057600080fd5b6131fc858286016130d3565b90969095509350505050565b60006020828403121561321a57600080fd5b8135611e8281612f10565b8183823760009101908152919050565b600181811c9082168061324957607f821691505b602082108103613282577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126132eb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261332a57600080fd5b83018035915067ffffffffffffffff82111561334557600080fd5b60200191503681900382131561311857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261338f57600080fd5b830160208101925035905067ffffffffffffffff8111156133af57600080fd5b80360382131561311857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612ff157813561342a81612f10565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613417565b60208152813560208201526000602083013561347781612dbc565b67ffffffffffffffff8082166040850152613495604086018661335a565b925060a060608601526134ac60c0860184836133be565b9250506134bc606086018661335a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526134f28583856133be565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261352b57600080fd5b6020928801928301923591508382111561354457600080fd5b8160061b360383131561355657600080fd5b8685030160a0870152612bac848284613407565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f8211156112d4576000816000526020600020601f850160051c810160208610156135c25750805b601f850160051c820191505b818110156135e1578281556001016135ce565b505050505050565b67ffffffffffffffff8311156136015761360161356a565b6136158361360f8354613235565b83613599565b6000601f84116001811461366757600085156136315750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110c9565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156136b65786850135825560209485019460019092019101613696565b50868210156136f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561373d81612f10565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156137a3576137a361356a565b8054838255808410156138305760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146137e4576137e4613703565b80861686146137f5576137f5613703565b5060008360005260206000208360011b81018760011b820191505b8082101561382b578282558284830155600282019150613810565b505050505b5060008181526020812083915b858110156135e15761384f8383613732565b604092909201916002919091019060010161383d565b8135815560018101602083013561387b81612dbc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556138bb60408601866132f5565b935091506138cd8383600287016135e9565b6138da60608601866132f5565b935091506138ec8383600387016135e9565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261392357600080fd5b91840191823591508082111561393857600080fd5b506020820191508060061b360382131561395157600080fd5b611bf281836004860161378a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126132eb57600080fd5b8015158114611e7357600080fd5b6000602082840312156139b357600080fd5b8135611e8281613993565b6020815260006121476020830184866133be565b600082516132eb818460208701612e74565b6040516060810167ffffffffffffffff81118282101715613a0757613a0761356a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5457613a5461356a565b604052919050565b600067ffffffffffffffff821115613a7657613a7661356a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ab357600080fd5b8135613ac6613ac182613a5c565b613a0d565b818152846020838601011115613adb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613b0a57600080fd5b813567ffffffffffffffff80821115613b2257600080fd5b9083019060608286031215613b3657600080fd5b613b3e6139e4565b823582811115613b4d57600080fd5b613b5987828601613aa2565b825250602083013582811115613b6e57600080fd5b613b7a87828601613aa2565b6020830152506040830135925060028310613b9457600080fd5b6040810192909252509392505050565b60008060408385031215613bb757600080fd5b825167ffffffffffffffff811115613bce57600080fd5b8301601f81018513613bdf57600080fd5b8051613bed613ac182613a5c565b818152866020838501011115613c0257600080fd5b613c13826020830160208601612e74565b60209590950151949694955050505050565b600060208284031215613c3757600080fd5b5051919050565b8082018082111561066e5761066e613703565b604081526000613c646040830185612e98565b90508260208301529392505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613c9f60e0840182612e98565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613cdb8383612e98565b92506040860151915080858403016080860152613cf88383612f9f565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613d368282612e98565b9695505050505050565b600060208284031215613d5257600080fd5b8151611e828161399356fea164736f6c6343000818000a", } -var CCIPReceiverWithAckABI = CCIPReceiverWithAckMetaData.ABI +var CCIPReceiverWithACKABI = CCIPReceiverWithACKMetaData.ABI -var CCIPReceiverWithAckBin = CCIPReceiverWithAckMetaData.Bin +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() +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 } @@ -66,154 +73,154 @@ func DeployCCIPReceiverWithAck(auth *bind.TransactOpts, backend bind.ContractBac return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPReceiverWithAckBin), backend, router, feeToken) + 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 + return address, tx, &CCIPReceiverWithACK{address: address, abi: *parsed, CCIPReceiverWithACKCaller: CCIPReceiverWithACKCaller{contract: contract}, CCIPReceiverWithACKTransactor: CCIPReceiverWithACKTransactor{contract: contract}, CCIPReceiverWithACKFilterer: CCIPReceiverWithACKFilterer{contract: contract}}, nil } -type CCIPReceiverWithAck struct { +type CCIPReceiverWithACK struct { address common.Address abi abi.ABI - CCIPReceiverWithAckCaller - CCIPReceiverWithAckTransactor - CCIPReceiverWithAckFilterer + CCIPReceiverWithACKCaller + CCIPReceiverWithACKTransactor + CCIPReceiverWithACKFilterer } -type CCIPReceiverWithAckCaller struct { +type CCIPReceiverWithACKCaller struct { contract *bind.BoundContract } -type CCIPReceiverWithAckTransactor struct { +type CCIPReceiverWithACKTransactor struct { contract *bind.BoundContract } -type CCIPReceiverWithAckFilterer struct { +type CCIPReceiverWithACKFilterer struct { contract *bind.BoundContract } -type CCIPReceiverWithAckSession struct { - Contract *CCIPReceiverWithAck +type CCIPReceiverWithACKSession struct { + Contract *CCIPReceiverWithACK CallOpts bind.CallOpts TransactOpts bind.TransactOpts } -type CCIPReceiverWithAckCallerSession struct { - Contract *CCIPReceiverWithAckCaller +type CCIPReceiverWithACKCallerSession struct { + Contract *CCIPReceiverWithACKCaller CallOpts bind.CallOpts } -type CCIPReceiverWithAckTransactorSession struct { - Contract *CCIPReceiverWithAckTransactor +type CCIPReceiverWithACKTransactorSession struct { + Contract *CCIPReceiverWithACKTransactor TransactOpts bind.TransactOpts } -type CCIPReceiverWithAckRaw struct { - Contract *CCIPReceiverWithAck +type CCIPReceiverWithACKRaw struct { + Contract *CCIPReceiverWithACK } -type CCIPReceiverWithAckCallerRaw struct { - Contract *CCIPReceiverWithAckCaller +type CCIPReceiverWithACKCallerRaw struct { + Contract *CCIPReceiverWithACKCaller } -type CCIPReceiverWithAckTransactorRaw struct { - Contract *CCIPReceiverWithAckTransactor +type CCIPReceiverWithACKTransactorRaw struct { + Contract *CCIPReceiverWithACKTransactor } -func NewCCIPReceiverWithAck(address common.Address, backend bind.ContractBackend) (*CCIPReceiverWithAck, error) { - abi, err := abi.JSON(strings.NewReader(CCIPReceiverWithAckABI)) +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) + 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 + 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) +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 + return &CCIPReceiverWithACKCaller{contract: contract}, nil } -func NewCCIPReceiverWithAckTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPReceiverWithAckTransactor, error) { - contract, err := bindCCIPReceiverWithAck(address, nil, transactor, 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 + return &CCIPReceiverWithACKTransactor{contract: contract}, nil } -func NewCCIPReceiverWithAckFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPReceiverWithAckFilterer, error) { - contract, err := bindCCIPReceiverWithAck(address, nil, nil, filterer) +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 + 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() +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) 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) 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 *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 *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) 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 *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) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "ACKMESSAGEMAGICBYTES") + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { - return *new([]byte), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _CCIPReceiverWithAck.Contract.ACKMESSAGEMAGICBYTES(&_CCIPReceiverWithAck.CallOpts) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) ACKMESSAGEHEADER() (string, error) { + return _CCIPReceiverWithACK.Contract.ACKMESSAGEHEADER(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) ACKMESSAGEMAGICBYTES() ([]byte, error) { - return _CCIPReceiverWithAck.Contract.ACKMESSAGEMAGICBYTES(&_CCIPReceiverWithAck.CallOpts) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) ACKMESSAGEHEADER() (string, error) { + return _CCIPReceiverWithACK.Contract.ACKMESSAGEHEADER(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "getMessageContents", messageId) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getMessageContents", messageId) if err != nil { return *new(ClientAny2EVMMessage), err @@ -225,17 +232,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetMessageContents(opts * } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { - return _CCIPReceiverWithAck.Contract.GetMessageContents(&_CCIPReceiverWithAck.CallOpts, messageId) +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 *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) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "getMessageStatus", messageId) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getMessageStatus", messageId) if err != nil { return *new(*big.Int), err @@ -247,17 +254,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetMessageStatus(opts *bi } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _CCIPReceiverWithAck.Contract.GetMessageStatus(&_CCIPReceiverWithAck.CallOpts, messageId) +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 *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) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "getRouter") + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getRouter") if err != nil { return *new(common.Address), err @@ -269,17 +276,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) GetRouter(opts *bind.Call } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) GetRouter() (common.Address, error) { - return _CCIPReceiverWithAck.Contract.GetRouter(&_CCIPReceiverWithAck.CallOpts) +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 *CCIPReceiverWithACKCallerSession) GetRouter() (common.Address, error) { + return _CCIPReceiverWithACK.Contract.GetRouter(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { +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) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) if err != nil { return *new(bool), err @@ -291,17 +298,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) IsApprovedSender(opts *bi } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) IsApprovedSender(sourceChainSelector uint64, senderAddr []byte) (bool, error) { - return _CCIPReceiverWithAck.Contract.IsApprovedSender(&_CCIPReceiverWithAck.CallOpts, sourceChainSelector, senderAddr) +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 *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) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "owner") + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "owner") if err != nil { return *new(common.Address), err @@ -313,21 +320,21 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) Owner(opts *bind.CallOpts } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) Owner() (common.Address, error) { - return _CCIPReceiverWithAck.Contract.Owner(&_CCIPReceiverWithAck.CallOpts) +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 *CCIPReceiverWithACKCallerSession) Owner() (common.Address, error) { + return _CCIPReceiverWithACK.Contract.Owner(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SChains(opts *bind.CallOpts, arg0 uint64) (SChains, +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "s_chains", arg0) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "s_chainConfigs", destChainSelector) - outstruct := new(SChains) + outstruct := new(SChainConfigs) if err != nil { return *outstruct, err } @@ -339,21 +346,21 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SChains(opts *bind.CallOp } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SChains(arg0 uint64) (SChains, +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPReceiverWithAck.Contract.SChains(&_CCIPReceiverWithAck.CallOpts, arg0) + return _CCIPReceiverWithACK.Contract.SChainConfigs(&_CCIPReceiverWithACK.CallOpts, destChainSelector) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCallerSession) SChains(arg0 uint64) (SChains, +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) SChainConfigs(destChainSelector uint64) (SChainConfigs, error) { - return _CCIPReceiverWithAck.Contract.SChains(&_CCIPReceiverWithAck.CallOpts, arg0) + return _CCIPReceiverWithACK.Contract.SChainConfigs(&_CCIPReceiverWithACK.CallOpts, destChainSelector) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "s_feeToken") + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "s_feeToken") if err != nil { return *new(common.Address), err @@ -365,17 +372,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SFeeToken(opts *bind.Call } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SFeeToken() (common.Address, error) { - return _CCIPReceiverWithAck.Contract.SFeeToken(&_CCIPReceiverWithAck.CallOpts) +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 *CCIPReceiverWithACKCallerSession) SFeeToken() (common.Address, error) { + return _CCIPReceiverWithACK.Contract.SFeeToken(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { var out []interface{} - err := _CCIPReceiverWithAck.contract.Call(opts, &out, "s_messageStatus", messageId) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "s_messageStatus", messageId) if err != nil { return *new(uint8), err @@ -387,206 +394,172 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckCaller) SMessageStatus(opts *bind } -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 *CCIPReceiverWithACKSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPReceiverWithACK.Contract.SMessageStatus(&_CCIPReceiverWithACK.CallOpts, messageId) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "acceptOwnership") +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPReceiverWithACK.Contract.SMessageStatus(&_CCIPReceiverWithACK.CallOpts, messageId) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) AcceptOwnership() (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.AcceptOwnership(&_CCIPReceiverWithAck.TransactOpts) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) AcceptOwnership() (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.AcceptOwnership(&_CCIPReceiverWithAck.TransactOpts) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.AbandonFailedMessage(&_CCIPReceiverWithACK.TransactOpts, messageId, receiver) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "ccipReceive", message) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) AbandonFailedMessage(messageId [32]byte, receiver common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.AbandonFailedMessage(&_CCIPReceiverWithACK.TransactOpts, messageId, receiver) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.CcipReceive(&_CCIPReceiverWithAck.TransactOpts, message) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "acceptOwnership") } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.CcipReceive(&_CCIPReceiverWithAck.TransactOpts, message) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.AcceptOwnership(&_CCIPReceiverWithACK.TransactOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "disableChain", chainSelector) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.AcceptOwnership(&_CCIPReceiverWithACK.TransactOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.DisableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "applyChainUpdates", chains) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) DisableChain(chainSelector uint64) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.DisableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.ApplyChainUpdates(&_CCIPReceiverWithACK.TransactOpts, chains) } -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 *CCIPReceiverWithACKTransactorSession) ApplyChainUpdates(chains []CCIPBaseChainUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.ApplyChainUpdates(&_CCIPReceiverWithACK.TransactOpts, chains) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.EnableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector, recipient, _extraArgsBytes) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "ccipReceive", message) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) EnableChain(chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.EnableChain(&_CCIPReceiverWithAck.TransactOpts, chainSelector, recipient, _extraArgsBytes) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.CcipReceive(&_CCIPReceiverWithACK.TransactOpts, message) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "modifyFeeToken", token) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.CcipReceive(&_CCIPReceiverWithACK.TransactOpts, message) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) 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 *CCIPReceiverWithAckTransactorSession) ModifyFeeToken(token common.Address) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.ModifyFeeToken(&_CCIPReceiverWithAck.TransactOpts, token) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.ProcessMessage(&_CCIPReceiverWithACK.TransactOpts, message) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) ProcessMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "processMessage", message) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.ProcessMessage(&_CCIPReceiverWithACK.TransactOpts, message) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) 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 *CCIPReceiverWithAckTransactorSession) ProcessMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.ProcessMessage(&_CCIPReceiverWithAck.TransactOpts, message) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.RetryFailedMessage(&_CCIPReceiverWithACK.TransactOpts, messageId) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) RetryFailedMessage(opts *bind.TransactOpts, messageId [32]byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "retryFailedMessage", messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.RetryFailedMessage(&_CCIPReceiverWithACK.TransactOpts, messageId) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.RetryFailedMessage(&_CCIPReceiverWithAck.TransactOpts, messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "transferOwnership", to) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) RetryFailedMessage(messageId [32]byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.RetryFailedMessage(&_CCIPReceiverWithAck.TransactOpts, messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.TransferOwnership(&_CCIPReceiverWithACK.TransactOpts, to) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) SetSimRevert(opts *bind.TransactOpts, simRevert bool) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "setSimRevert", simRevert) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.TransferOwnership(&_CCIPReceiverWithACK.TransactOpts, to) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.SetSimRevert(&_CCIPReceiverWithAck.TransactOpts, simRevert) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "updateApprovedSenders", adds, removes) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) SetSimRevert(simRevert bool) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.SetSimRevert(&_CCIPReceiverWithAck.TransactOpts, simRevert) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.UpdateApprovedSenders(&_CCIPReceiverWithACK.TransactOpts, adds, removes) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "transferOwnership", to) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.UpdateApprovedSenders(&_CCIPReceiverWithACK.TransactOpts, adds, removes) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.TransferOwnership(&_CCIPReceiverWithAck.TransactOpts, to) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "updateFeeToken", token) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.TransferOwnership(&_CCIPReceiverWithAck.TransactOpts, to) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.UpdateFeeToken(&_CCIPReceiverWithACK.TransactOpts, token) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.Transact(opts, "updateApprovedSenders", adds, removes) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.UpdateFeeToken(&_CCIPReceiverWithACK.TransactOpts, token) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.UpdateApprovedSenders(&_CCIPReceiverWithAck.TransactOpts, adds, removes) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.contract.Transact(opts, "updateRouter", newRouter) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactorSession) UpdateApprovedSenders(adds []ICCIPClientBaseapprovedSenderUpdate, removes []ICCIPClientBaseapprovedSenderUpdate) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.UpdateApprovedSenders(&_CCIPReceiverWithAck.TransactOpts, adds, removes) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.UpdateRouter(&_CCIPReceiverWithACK.TransactOpts, newRouter) } -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 *CCIPReceiverWithACKTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.UpdateRouter(&_CCIPReceiverWithACK.TransactOpts, newRouter) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.WithdrawNativeToken(&_CCIPReceiverWithAck.TransactOpts, to, amount) +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 *CCIPReceiverWithAckTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.WithdrawNativeToken(&_CCIPReceiverWithAck.TransactOpts, 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 *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 *CCIPReceiverWithACKTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.WithdrawNativeToken(&_CCIPReceiverWithACK.TransactOpts, 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 *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 *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 *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 *CCIPReceiverWithAckTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.RawTransact(opts, calldata) +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 *CCIPReceiverWithAckSession) 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 *CCIPReceiverWithAckTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { - return _CCIPReceiverWithAck.Contract.Fallback(&_CCIPReceiverWithAck.TransactOpts, calldata) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) Receive() (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.Receive(&_CCIPReceiverWithACK.TransactOpts) } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CCIPReceiverWithAck.contract.RawTransact(opts, nil) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) Receive() (*types.Transaction, error) { + return _CCIPReceiverWithACK.Contract.Receive(&_CCIPReceiverWithACK.TransactOpts) } -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 +type CCIPReceiverWithACKApprovedSenderAddedIterator struct { + Event *CCIPReceiverWithACKApprovedSenderAdded contract *bind.BoundContract event string @@ -597,7 +570,7 @@ type CCIPReceiverWithAckFeeTokenModifiedIterator struct { fail error } -func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Next() bool { +func (it *CCIPReceiverWithACKApprovedSenderAddedIterator) Next() bool { if it.fail != nil { return false @@ -606,7 +579,7 @@ func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckFeeTokenModified) + it.Event = new(CCIPReceiverWithACKApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -621,7 +594,7 @@ func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckFeeTokenModified) + it.Event = new(CCIPReceiverWithACKApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -636,51 +609,51 @@ func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Next() bool { } } -func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Error() error { +func (it *CCIPReceiverWithACKApprovedSenderAddedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckFeeTokenModifiedIterator) Close() error { +func (it *CCIPReceiverWithACKApprovedSenderAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckFeeTokenModified struct { - OldToken common.Address - NewToken common.Address - Raw types.Log +type CCIPReceiverWithACKApprovedSenderAdded struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterFeeTokenModified(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPReceiverWithAckFeeTokenModifiedIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverWithACKApprovedSenderAddedIterator, error) { - var oldTokenRule []interface{} - for _, oldTokenItem := range oldToken { - oldTokenRule = append(oldTokenRule, oldTokenItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) } - var newTokenRule []interface{} - for _, newTokenItem := range newToken { - newTokenRule = append(newTokenRule, newTokenItem) + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckFeeTokenModifiedIterator{contract: _CCIPReceiverWithAck.contract, event: "FeeTokenModified", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKApprovedSenderAddedIterator{contract: _CCIPReceiverWithACK.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - var oldTokenRule []interface{} - for _, oldTokenItem := range oldToken { - oldTokenRule = append(oldTokenRule, oldTokenItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) } - var newTokenRule []interface{} - for _, newTokenItem := range newToken { - newTokenRule = append(newTokenRule, newTokenItem) + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "FeeTokenModified", oldTokenRule, newTokenRule) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -690,8 +663,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchFeeTokenModified(o select { case log := <-logs: - event := new(CCIPReceiverWithAckFeeTokenModified) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { + event := new(CCIPReceiverWithACKApprovedSenderAdded) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return err } event.Raw = log @@ -712,17 +685,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchFeeTokenModified(o }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseFeeTokenModified(log types.Log) (*CCIPReceiverWithAckFeeTokenModified, error) { - event := new(CCIPReceiverWithAckFeeTokenModified) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "FeeTokenModified", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseApprovedSenderAdded(log types.Log) (*CCIPReceiverWithACKApprovedSenderAdded, error) { + event := new(CCIPReceiverWithACKApprovedSenderAdded) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckMessageAckReceivedIterator struct { - Event *CCIPReceiverWithAckMessageAckReceived +type CCIPReceiverWithACKApprovedSenderRemovedIterator struct { + Event *CCIPReceiverWithACKApprovedSenderRemoved contract *bind.BoundContract event string @@ -733,7 +706,7 @@ type CCIPReceiverWithAckMessageAckReceivedIterator struct { fail error } -func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Next() bool { +func (it *CCIPReceiverWithACKApprovedSenderRemovedIterator) Next() bool { if it.fail != nil { return false @@ -742,7 +715,7 @@ func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageAckReceived) + it.Event = new(CCIPReceiverWithACKApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -757,7 +730,7 @@ func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageAckReceived) + it.Event = new(CCIPReceiverWithACKApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -772,32 +745,51 @@ func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Next() bool { } } -func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Error() error { +func (it *CCIPReceiverWithACKApprovedSenderRemovedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckMessageAckReceivedIterator) Close() error { +func (it *CCIPReceiverWithACKApprovedSenderRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckMessageAckReceived struct { - Arg0 [32]byte - Raw types.Log +type CCIPReceiverWithACKApprovedSenderRemoved struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckReceivedIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverWithACKApprovedSenderRemovedIterator, error) { - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageAckReceived") + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckMessageAckReceivedIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKApprovedSenderRemovedIterator{contract: _CCIPReceiverWithACK.contract, event: "ApprovedSenderRemoved", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckReceived) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageAckReceived") + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -807,8 +799,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckReceived select { case log := <-logs: - event := new(CCIPReceiverWithAckMessageAckReceived) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { + event := new(CCIPReceiverWithACKApprovedSenderRemoved) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return err } event.Raw = log @@ -829,17 +821,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckReceived }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageAckReceived(log types.Log) (*CCIPReceiverWithAckMessageAckReceived, error) { - event := new(CCIPReceiverWithAckMessageAckReceived) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseApprovedSenderRemoved(log types.Log) (*CCIPReceiverWithACKApprovedSenderRemoved, error) { + event := new(CCIPReceiverWithACKApprovedSenderRemoved) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckMessageAckSentIterator struct { - Event *CCIPReceiverWithAckMessageAckSent +type CCIPReceiverWithACKCCIPRouterModifiedIterator struct { + Event *CCIPReceiverWithACKCCIPRouterModified contract *bind.BoundContract event string @@ -850,7 +842,7 @@ type CCIPReceiverWithAckMessageAckSentIterator struct { fail error } -func (it *CCIPReceiverWithAckMessageAckSentIterator) Next() bool { +func (it *CCIPReceiverWithACKCCIPRouterModifiedIterator) Next() bool { if it.fail != nil { return false @@ -859,7 +851,7 @@ func (it *CCIPReceiverWithAckMessageAckSentIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageAckSent) + it.Event = new(CCIPReceiverWithACKCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -874,7 +866,7 @@ func (it *CCIPReceiverWithAckMessageAckSentIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageAckSent) + it.Event = new(CCIPReceiverWithACKCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -889,32 +881,51 @@ func (it *CCIPReceiverWithAckMessageAckSentIterator) Next() bool { } } -func (it *CCIPReceiverWithAckMessageAckSentIterator) Error() error { +func (it *CCIPReceiverWithACKCCIPRouterModifiedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckMessageAckSentIterator) Close() error { +func (it *CCIPReceiverWithACKCCIPRouterModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckMessageAckSent struct { - IncomingMessageId [32]byte - Raw types.Log +type CCIPReceiverWithACKCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckSentIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPReceiverWithACKCCIPRouterModifiedIterator, error) { + + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageAckSent") + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckMessageAckSentIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKCCIPRouterModifiedIterator{contract: _CCIPReceiverWithACK.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckSent) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageAckSent") + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) + } + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) + } + + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } @@ -924,8 +935,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckSent(opt select { case log := <-logs: - event := new(CCIPReceiverWithAckMessageAckSent) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckSent", log); err != nil { + event := new(CCIPReceiverWithACKCCIPRouterModified) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return err } event.Raw = log @@ -946,17 +957,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageAckSent(opt }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageAckSent(log types.Log) (*CCIPReceiverWithAckMessageAckSent, error) { - event := new(CCIPReceiverWithAckMessageAckSent) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageAckSent", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseCCIPRouterModified(log types.Log) (*CCIPReceiverWithACKCCIPRouterModified, error) { + event := new(CCIPReceiverWithACKCCIPRouterModified) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckMessageFailedIterator struct { - Event *CCIPReceiverWithAckMessageFailed +type CCIPReceiverWithACKChainAddedIterator struct { + Event *CCIPReceiverWithACKChainAdded contract *bind.BoundContract event string @@ -967,7 +978,7 @@ type CCIPReceiverWithAckMessageFailedIterator struct { fail error } -func (it *CCIPReceiverWithAckMessageFailedIterator) Next() bool { +func (it *CCIPReceiverWithACKChainAddedIterator) Next() bool { if it.fail != nil { return false @@ -976,7 +987,7 @@ func (it *CCIPReceiverWithAckMessageFailedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageFailed) + it.Event = new(CCIPReceiverWithACKChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -991,7 +1002,7 @@ func (it *CCIPReceiverWithAckMessageFailedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageFailed) + it.Event = new(CCIPReceiverWithACKChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1006,43 +1017,52 @@ func (it *CCIPReceiverWithAckMessageFailedIterator) Next() bool { } } -func (it *CCIPReceiverWithAckMessageFailedIterator) Error() error { +func (it *CCIPReceiverWithACKChainAddedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckMessageFailedIterator) Close() error { +func (it *CCIPReceiverWithACKChainAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckMessageFailed struct { - MessageId [32]byte - Reason []byte - Raw types.Log +type CCIPReceiverWithACKChainAdded struct { + RemoteChainSelector uint64 + Recipient common.Hash + ExtraArgsBytes []byte + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageFailedIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPReceiverWithACKChainAddedIterator, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageFailed", messageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckMessageFailedIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageFailed", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKChainAddedIterator{contract: _CCIPReceiverWithACK.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageFailed, messageId [][32]byte) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageFailed", messageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -1052,8 +1072,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageFailed(opts select { case log := <-logs: - event := new(CCIPReceiverWithAckMessageFailed) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageFailed", log); err != nil { + event := new(CCIPReceiverWithACKChainAdded) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ChainAdded", log); err != nil { return err } event.Raw = log @@ -1074,17 +1094,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageFailed(opts }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageFailed(log types.Log) (*CCIPReceiverWithAckMessageFailed, error) { - event := new(CCIPReceiverWithAckMessageFailed) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageFailed", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseChainAdded(log types.Log) (*CCIPReceiverWithACKChainAdded, error) { + event := new(CCIPReceiverWithACKChainAdded) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ChainAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckMessageRecoveredIterator struct { - Event *CCIPReceiverWithAckMessageRecovered +type CCIPReceiverWithACKChainRemovedIterator struct { + Event *CCIPReceiverWithACKChainRemoved contract *bind.BoundContract event string @@ -1095,7 +1115,7 @@ type CCIPReceiverWithAckMessageRecoveredIterator struct { fail error } -func (it *CCIPReceiverWithAckMessageRecoveredIterator) Next() bool { +func (it *CCIPReceiverWithACKChainRemovedIterator) Next() bool { if it.fail != nil { return false @@ -1104,7 +1124,7 @@ func (it *CCIPReceiverWithAckMessageRecoveredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageRecovered) + it.Event = new(CCIPReceiverWithACKChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1119,7 +1139,7 @@ func (it *CCIPReceiverWithAckMessageRecoveredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageRecovered) + it.Event = new(CCIPReceiverWithACKChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1134,42 +1154,42 @@ func (it *CCIPReceiverWithAckMessageRecoveredIterator) Next() bool { } } -func (it *CCIPReceiverWithAckMessageRecoveredIterator) Error() error { +func (it *CCIPReceiverWithACKChainRemovedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckMessageRecoveredIterator) Close() error { +func (it *CCIPReceiverWithACKChainRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckMessageRecovered struct { - MessageId [32]byte - Raw types.Log +type CCIPReceiverWithACKChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageRecoveredIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPReceiverWithACKChainRemovedIterator, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckMessageRecoveredIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKChainRemovedIterator{contract: _CCIPReceiverWithACK.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageRecovered, messageId [][32]byte) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { - var messageIdRule []interface{} - for _, messageIdItem := range messageId { - messageIdRule = append(messageIdRule, messageIdItem) + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -1179,8 +1199,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageRecovered(o select { case log := <-logs: - event := new(CCIPReceiverWithAckMessageRecovered) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageRecovered", log); err != nil { + event := new(CCIPReceiverWithACKChainRemoved) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return err } event.Raw = log @@ -1201,17 +1221,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageRecovered(o }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageRecovered(log types.Log) (*CCIPReceiverWithAckMessageRecovered, error) { - event := new(CCIPReceiverWithAckMessageRecovered) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageRecovered", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseChainRemoved(log types.Log) (*CCIPReceiverWithACKChainRemoved, error) { + event := new(CCIPReceiverWithACKChainRemoved) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckMessageSentIterator struct { - Event *CCIPReceiverWithAckMessageSent +type CCIPReceiverWithACKFeeTokenUpdatedIterator struct { + Event *CCIPReceiverWithACKFeeTokenUpdated contract *bind.BoundContract event string @@ -1222,7 +1242,7 @@ type CCIPReceiverWithAckMessageSentIterator struct { fail error } -func (it *CCIPReceiverWithAckMessageSentIterator) Next() bool { +func (it *CCIPReceiverWithACKFeeTokenUpdatedIterator) Next() bool { if it.fail != nil { return false @@ -1231,7 +1251,7 @@ func (it *CCIPReceiverWithAckMessageSentIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageSent) + it.Event = new(CCIPReceiverWithACKFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1246,7 +1266,7 @@ func (it *CCIPReceiverWithAckMessageSentIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageSent) + it.Event = new(CCIPReceiverWithACKFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1261,51 +1281,51 @@ func (it *CCIPReceiverWithAckMessageSentIterator) Next() bool { } } -func (it *CCIPReceiverWithAckMessageSentIterator) Error() error { +func (it *CCIPReceiverWithACKFeeTokenUpdatedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckMessageSentIterator) Close() error { +func (it *CCIPReceiverWithACKFeeTokenUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckMessageSent struct { - IncomingMessageId [32]byte - ACKMessageId [32]byte - Raw types.Log +type CCIPReceiverWithACKFeeTokenUpdated struct { + OldToken common.Address + NewToken common.Address + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPReceiverWithAckMessageSentIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPReceiverWithACKFeeTokenUpdatedIterator, error) { - var incomingMessageIdRule []interface{} - for _, incomingMessageIdItem := range incomingMessageId { - incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) } - var ACKMessageIdRule []interface{} - for _, ACKMessageIdItem := range ACKMessageId { - ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckMessageSentIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageSent", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKFeeTokenUpdatedIterator{contract: _CCIPReceiverWithACK.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) { - var incomingMessageIdRule []interface{} - for _, incomingMessageIdItem := range incomingMessageId { - incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) + var oldTokenRule []interface{} + for _, oldTokenItem := range oldToken { + oldTokenRule = append(oldTokenRule, oldTokenItem) } - var ACKMessageIdRule []interface{} - for _, ACKMessageIdItem := range ACKMessageId { - ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) + var newTokenRule []interface{} + for _, newTokenItem := range newToken { + newTokenRule = append(newTokenRule, newTokenItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) if err != nil { return nil, err } @@ -1315,8 +1335,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSent(opts * select { case log := <-logs: - event := new(CCIPReceiverWithAckMessageSent) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSent", log); err != nil { + event := new(CCIPReceiverWithACKFeeTokenUpdated) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return err } event.Raw = log @@ -1337,17 +1357,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSent(opts * }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageSent(log types.Log) (*CCIPReceiverWithAckMessageSent, error) { - event := new(CCIPReceiverWithAckMessageSent) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSent", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseFeeTokenUpdated(log types.Log) (*CCIPReceiverWithACKFeeTokenUpdated, error) { + event := new(CCIPReceiverWithACKFeeTokenUpdated) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckMessageSucceededIterator struct { - Event *CCIPReceiverWithAckMessageSucceeded +type CCIPReceiverWithACKMessageAbandonedIterator struct { + Event *CCIPReceiverWithACKMessageAbandoned contract *bind.BoundContract event string @@ -1358,7 +1378,7 @@ type CCIPReceiverWithAckMessageSucceededIterator struct { fail error } -func (it *CCIPReceiverWithAckMessageSucceededIterator) Next() bool { +func (it *CCIPReceiverWithACKMessageAbandonedIterator) Next() bool { if it.fail != nil { return false @@ -1367,7 +1387,7 @@ func (it *CCIPReceiverWithAckMessageSucceededIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageSucceeded) + it.Event = new(CCIPReceiverWithACKMessageAbandoned) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1382,7 +1402,7 @@ func (it *CCIPReceiverWithAckMessageSucceededIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckMessageSucceeded) + it.Event = new(CCIPReceiverWithACKMessageAbandoned) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1397,42 +1417,43 @@ func (it *CCIPReceiverWithAckMessageSucceededIterator) Next() bool { } } -func (it *CCIPReceiverWithAckMessageSucceededIterator) Error() error { +func (it *CCIPReceiverWithACKMessageAbandonedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckMessageSucceededIterator) Close() error { +func (it *CCIPReceiverWithACKMessageAbandonedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckMessageSucceeded struct { - MessageId [32]byte - Raw types.Log +type CCIPReceiverWithACKMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageSucceededIterator, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithACKMessageAbandonedIterator, error) { var messageIdRule []interface{} for _, messageIdItem := range messageId { messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "MessageSucceeded", messageIdRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "MessageAbandoned", messageIdRule) if err != nil { return nil, err } - return &CCIPReceiverWithAckMessageSucceededIterator{contract: _CCIPReceiverWithAck.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKMessageAbandonedIterator{contract: _CCIPReceiverWithACK.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSucceeded, messageId [][32]byte) (event.Subscription, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageAbandoned, 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) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "MessageAbandoned", messageIdRule) if err != nil { return nil, err } @@ -1442,8 +1463,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSucceeded(o select { case log := <-logs: - event := new(CCIPReceiverWithAckMessageSucceeded) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { + event := new(CCIPReceiverWithACKMessageAbandoned) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { return err } event.Raw = log @@ -1464,17 +1485,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchMessageSucceeded(o }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseMessageSucceeded(log types.Log) (*CCIPReceiverWithAckMessageSucceeded, error) { - event := new(CCIPReceiverWithAckMessageSucceeded) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) ParseMessageAbandoned(log types.Log) (*CCIPReceiverWithACKMessageAbandoned, error) { + event := new(CCIPReceiverWithACKMessageAbandoned) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { return nil, err } event.Raw = log return event, nil } -type CCIPReceiverWithAckOwnershipTransferRequestedIterator struct { - Event *CCIPReceiverWithAckOwnershipTransferRequested +type CCIPReceiverWithACKMessageAckReceivedIterator struct { + Event *CCIPReceiverWithACKMessageAckReceived contract *bind.BoundContract event string @@ -1485,7 +1506,7 @@ type CCIPReceiverWithAckOwnershipTransferRequestedIterator struct { fail error } -func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Next() bool { +func (it *CCIPReceiverWithACKMessageAckReceivedIterator) Next() bool { if it.fail != nil { return false @@ -1494,7 +1515,7 @@ func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckOwnershipTransferRequested) + it.Event = new(CCIPReceiverWithACKMessageAckReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1509,7 +1530,7 @@ func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckOwnershipTransferRequested) + it.Event = new(CCIPReceiverWithACKMessageAckReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1524,51 +1545,32 @@ func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Next() bool { } } -func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Error() error { +func (it *CCIPReceiverWithACKMessageAckReceivedIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckOwnershipTransferRequestedIterator) Close() error { +func (it *CCIPReceiverWithACKMessageAckReceivedIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log +type CCIPReceiverWithACKMessageAckReceived struct { + MessageId [32]byte + 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) - } +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPReceiverWithACKMessageAckReceivedIterator, error) { - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "MessageAckReceived") if err != nil { return nil, err } - return &CCIPReceiverWithAckOwnershipTransferRequestedIterator{contract: _CCIPReceiverWithAck.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKMessageAckReceivedIterator{contract: _CCIPReceiverWithACK.contract, event: "MessageAckReceived", 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) - } +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageAckReceived) (event.Subscription, error) { - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "MessageAckReceived") if err != nil { return nil, err } @@ -1578,8 +1580,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchOwnershipTransferR select { case log := <-logs: - event := new(CCIPReceiverWithAckOwnershipTransferRequested) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + event := new(CCIPReceiverWithACKMessageAckReceived) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "MessageAckReceived", log); err != nil { return err } event.Raw = log @@ -1600,17 +1602,17 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchOwnershipTransferR }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverWithAckOwnershipTransferRequested, error) { - event := new(CCIPReceiverWithAckOwnershipTransferRequested) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != 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 CCIPReceiverWithAckOwnershipTransferredIterator struct { - Event *CCIPReceiverWithAckOwnershipTransferred +type CCIPReceiverWithACKMessageAckSentIterator struct { + Event *CCIPReceiverWithACKMessageAckSent contract *bind.BoundContract event string @@ -1621,7 +1623,7 @@ type CCIPReceiverWithAckOwnershipTransferredIterator struct { fail error } -func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Next() bool { +func (it *CCIPReceiverWithACKMessageAckSentIterator) Next() bool { if it.fail != nil { return false @@ -1630,7 +1632,7 @@ func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckOwnershipTransferred) + it.Event = new(CCIPReceiverWithACKMessageAckSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1645,7 +1647,7 @@ func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(CCIPReceiverWithAckOwnershipTransferred) + it.Event = new(CCIPReceiverWithACKMessageAckSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1660,51 +1662,32 @@ func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Next() bool { } } -func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Error() error { +func (it *CCIPReceiverWithACKMessageAckSentIterator) Error() error { return it.fail } -func (it *CCIPReceiverWithAckOwnershipTransferredIterator) Close() error { +func (it *CCIPReceiverWithACKMessageAckSentIterator) Close() error { it.sub.Unsubscribe() return nil } -type CCIPReceiverWithAckOwnershipTransferred struct { - From common.Address - To common.Address - Raw types.Log +type CCIPReceiverWithACKMessageAckSent struct { + IncomingMessageId [32]byte + 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) - } +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPReceiverWithACKMessageAckSentIterator, error) { - logs, sub, err := _CCIPReceiverWithAck.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "MessageAckSent") if err != nil { return nil, err } - return &CCIPReceiverWithAckOwnershipTransferredIterator{contract: _CCIPReceiverWithAck.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &CCIPReceiverWithACKMessageAckSentIterator{contract: _CCIPReceiverWithACK.contract, event: "MessageAckSent", 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) - } +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageAckSent) (event.Subscription, error) { - logs, sub, err := _CCIPReceiverWithAck.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "MessageAckSent") if err != nil { return nil, err } @@ -1714,8 +1697,8 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchOwnershipTransferr select { case log := <-logs: - event := new(CCIPReceiverWithAckOwnershipTransferred) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + event := new(CCIPReceiverWithACKMessageAckSent) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "MessageAckSent", log); err != nil { return err } event.Raw = log @@ -1736,100 +1719,1069 @@ func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) WatchOwnershipTransferr }), nil } -func (_CCIPReceiverWithAck *CCIPReceiverWithAckFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPReceiverWithAckOwnershipTransferred, error) { - event := new(CCIPReceiverWithAckOwnershipTransferred) - if err := _CCIPReceiverWithAck.contract.UnpackLog(event, "OwnershipTransferred", log); err != 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 SChains struct { - Recipient []byte - ExtraArgsBytes []byte +type CCIPReceiverWithACKMessageFailedIterator struct { + Event *CCIPReceiverWithACKMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -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) +func (it *CCIPReceiverWithACKMessageFailedIterator) Next() bool { - default: - return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + if it.fail != nil { + return false } -} -func (CCIPReceiverWithAckFeeTokenModified) Topic() common.Hash { - return common.HexToHash("0x4a1cb6b940121ea2ba30fb9b494035cbfe2d4b6b080db8b502150410bef7eb4e") -} + 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 -func (CCIPReceiverWithAckMessageAckReceived) Topic() common.Hash { - return common.HexToHash("0xef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79") -} + default: + return false + } + } -func (CCIPReceiverWithAckMessageAckSent) Topic() common.Hash { - return common.HexToHash("0x75944f95ba0be568cb30faeb0ef135cb73d07006939da29722d670a97f5c5b26") -} + 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 -func (CCIPReceiverWithAckMessageFailed) Topic() common.Hash { - return common.HexToHash("0x55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f") + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -func (CCIPReceiverWithAckMessageRecovered) Topic() common.Hash { - return common.HexToHash("0xef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad") +func (it *CCIPReceiverWithACKMessageFailedIterator) Error() error { + return it.fail } -func (CCIPReceiverWithAckMessageSent) Topic() common.Hash { - return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") +func (it *CCIPReceiverWithACKMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil } -func (CCIPReceiverWithAckMessageSucceeded) Topic() common.Hash { - return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +type CCIPReceiverWithACKMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log } -func (CCIPReceiverWithAckOwnershipTransferRequested) Topic() common.Hash { - return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") -} +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithACKMessageFailedIterator, error) { -func (CCIPReceiverWithAckOwnershipTransferred) Topic() common.Hash { - return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") -} + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } -func (_CCIPReceiverWithAck *CCIPReceiverWithAck) Address() common.Address { - return _CCIPReceiverWithAck.address + 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 } -type CCIPReceiverWithAckInterface interface { - ACKMESSAGEMAGICBYTES(opts *bind.CallOpts) ([]byte, error) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageFailed, messageId [][32]byte) (event.Subscription, error) { - GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) - - GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } - GetRouter(opts *bind.CallOpts) (common.Address, error) + 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: - IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + 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 CCIPReceiverWithACKTokensWithdrawnByOwnerIterator struct { + Event *CCIPReceiverWithACKTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReceiverWithACKTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReceiverWithACKTokensWithdrawnByOwner) + 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(CCIPReceiverWithACKTokensWithdrawnByOwner) + 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 *CCIPReceiverWithACKTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *CCIPReceiverWithACKTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReceiverWithACKTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPReceiverWithACKTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPReceiverWithACK.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &CCIPReceiverWithACKTokensWithdrawnByOwnerIterator{contract: _CCIPReceiverWithACK.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_CCIPReceiverWithACK *CCIPReceiverWithACKFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _CCIPReceiverWithACK.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(CCIPReceiverWithACKTokensWithdrawnByOwner) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*CCIPReceiverWithACKTokensWithdrawnByOwner, error) { + event := new(CCIPReceiverWithACKTokensWithdrawnByOwner) + if err := _CCIPReceiverWithACK.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChainConfigs struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_CCIPReceiverWithACK *CCIPReceiverWithACK) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPReceiverWithACK.abi.Events["ApprovedSenderAdded"].ID: + return _CCIPReceiverWithACK.ParseApprovedSenderAdded(log) + case _CCIPReceiverWithACK.abi.Events["ApprovedSenderRemoved"].ID: + return _CCIPReceiverWithACK.ParseApprovedSenderRemoved(log) + case _CCIPReceiverWithACK.abi.Events["CCIPRouterModified"].ID: + return _CCIPReceiverWithACK.ParseCCIPRouterModified(log) + case _CCIPReceiverWithACK.abi.Events["ChainAdded"].ID: + return _CCIPReceiverWithACK.ParseChainAdded(log) + case _CCIPReceiverWithACK.abi.Events["ChainRemoved"].ID: + return _CCIPReceiverWithACK.ParseChainRemoved(log) + case _CCIPReceiverWithACK.abi.Events["FeeTokenUpdated"].ID: + return _CCIPReceiverWithACK.ParseFeeTokenUpdated(log) + case _CCIPReceiverWithACK.abi.Events["MessageAbandoned"].ID: + return _CCIPReceiverWithACK.ParseMessageAbandoned(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) + case _CCIPReceiverWithACK.abi.Events["TokensWithdrawnByOwner"].ID: + return _CCIPReceiverWithACK.ParseTokensWithdrawnByOwner(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPReceiverWithACKApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (CCIPReceiverWithACKApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") +} + +func (CCIPReceiverWithACKCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (CCIPReceiverWithACKChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (CCIPReceiverWithACKChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (CCIPReceiverWithACKFeeTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67") +} + +func (CCIPReceiverWithACKMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + +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 (CCIPReceiverWithACKTokensWithdrawnByOwner) Topic() common.Hash { + return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") +} + +func (_CCIPReceiverWithACK *CCIPReceiverWithACK) Address() common.Address { + return _CCIPReceiverWithACK.address +} + +type CCIPReceiverWithACKInterface interface { + ACKMESSAGEHEADER(opts *bind.CallOpts) (string, 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, + SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) @@ -1837,89 +2789,127 @@ type CCIPReceiverWithAckInterface interface { SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) + AbandonFailedMessage(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) - - DisableChain(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) - - EnableChain(opts *bind.TransactOpts, chainSelector uint64, recipient []byte, _extraArgsBytes []byte) (*types.Transaction, error) + ApplyChainUpdates(opts *bind.TransactOpts, chains []CCIPBaseChainUpdate) (*types.Transaction, error) - ModifyFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*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) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + + UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverWithACKApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*CCIPReceiverWithACKApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*CCIPReceiverWithACKApprovedSenderRemovedIterator, error) + + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderRemoved(log types.Log) (*CCIPReceiverWithACKApprovedSenderRemoved, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*CCIPReceiverWithACKCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*CCIPReceiverWithACKCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*CCIPReceiverWithACKChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*CCIPReceiverWithACKChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*CCIPReceiverWithACKChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKChainRemoved, removeChainSelector []uint64) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*CCIPReceiverWithACKChainRemoved, error) + + FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*CCIPReceiverWithACKFeeTokenUpdatedIterator, error) + + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + + ParseFeeTokenUpdated(log types.Log) (*CCIPReceiverWithACKFeeTokenUpdated, error) + + FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithACKMessageAbandonedIterator, error) + + WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageAbandoned, messageId [][32]byte) (event.Subscription, error) + + ParseMessageAbandoned(log types.Log) (*CCIPReceiverWithACKMessageAbandoned, error) + + FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPReceiverWithACKMessageAckReceivedIterator, error) - WatchFeeTokenModified(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckFeeTokenModified, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageAckReceived) (event.Subscription, error) - ParseFeeTokenModified(log types.Log) (*CCIPReceiverWithAckFeeTokenModified, error) + ParseMessageAckReceived(log types.Log) (*CCIPReceiverWithACKMessageAckReceived, error) - FilterMessageAckReceived(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckReceivedIterator, error) + FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPReceiverWithACKMessageAckSentIterator, error) - WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckReceived) (event.Subscription, error) + WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageAckSent) (event.Subscription, error) - ParseMessageAckReceived(log types.Log) (*CCIPReceiverWithAckMessageAckReceived, error) + ParseMessageAckSent(log types.Log) (*CCIPReceiverWithACKMessageAckSent, error) - FilterMessageAckSent(opts *bind.FilterOpts) (*CCIPReceiverWithAckMessageAckSentIterator, error) + FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithACKMessageFailedIterator, error) - WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageAckSent) (event.Subscription, error) + WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageFailed, messageId [][32]byte) (event.Subscription, error) - ParseMessageAckSent(log types.Log) (*CCIPReceiverWithAckMessageAckSent, error) + ParseMessageFailed(log types.Log) (*CCIPReceiverWithACKMessageFailed, error) - FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageFailedIterator, error) + FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithACKMessageRecoveredIterator, error) - WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageFailed, messageId [][32]byte) (event.Subscription, error) + WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageRecovered, messageId [][32]byte) (event.Subscription, error) - ParseMessageFailed(log types.Log) (*CCIPReceiverWithAckMessageFailed, error) + ParseMessageRecovered(log types.Log) (*CCIPReceiverWithACKMessageRecovered, error) - FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageRecoveredIterator, error) + FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPReceiverWithACKMessageSentIterator, error) - WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageRecovered, messageId [][32]byte) (event.Subscription, error) + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) - ParseMessageRecovered(log types.Log) (*CCIPReceiverWithAckMessageRecovered, error) + ParseMessageSent(log types.Log) (*CCIPReceiverWithACKMessageSent, error) - FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*CCIPReceiverWithAckMessageSentIterator, error) + FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithACKMessageSucceededIterator, error) - WatchMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKMessageSucceeded, messageId [][32]byte) (event.Subscription, error) - ParseMessageSent(log types.Log) (*CCIPReceiverWithAckMessageSent, error) + ParseMessageSucceeded(log types.Log) (*CCIPReceiverWithACKMessageSucceeded, error) - FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*CCIPReceiverWithAckMessageSucceededIterator, error) + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithACKOwnershipTransferRequestedIterator, error) - WatchMessageSucceeded(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckMessageSucceeded, messageId [][32]byte) (event.Subscription, error) + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) - ParseMessageSucceeded(log types.Log) (*CCIPReceiverWithAckMessageSucceeded, error) + ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverWithACKOwnershipTransferRequested, error) - FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithAckOwnershipTransferRequestedIterator, error) + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithACKOwnershipTransferredIterator, error) - WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) - ParseOwnershipTransferRequested(log types.Log) (*CCIPReceiverWithAckOwnershipTransferRequested, error) + ParseOwnershipTransferred(log types.Log) (*CCIPReceiverWithACKOwnershipTransferred, error) - FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPReceiverWithAckOwnershipTransferredIterator, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPReceiverWithACKTokensWithdrawnByOwnerIterator, error) - WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithAckOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPReceiverWithACKTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) - ParseOwnershipTransferred(log types.Log) (*CCIPReceiverWithAckOwnershipTransferred, error) + ParseTokensWithdrawnByOwner(log types.Log) (*CCIPReceiverWithACKTokensWithdrawnByOwner, error) ParseLog(log types.Log) (generated.AbigenLog, 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 67426196c0..7075e67b65 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -6,6 +6,7 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMint burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 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 3f0dfdc726b764afa0dca19c1974a2d50e785423ff2035023f4ca7cf7933e4a6 +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 446a05c235e14f263764f126ce06602c7035aab4bb984b204d40c89646cd7b09 ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0d7d496ff6aaf37fcf8db25c708b6977c841650027a2028c864f7a0e17fa7b08 ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e6bfb15f1f320cceb76435f49b43c90bfcfc69b4561c811c4b938a6356a23566 ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin e142b529faf36c9dbc55be72947493f235e1d6ac2d76658a2273ac8e53ac4f5e diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index 0bfd29b168..24d69dfecc 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -42,6 +42,7 @@ package ccip // 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/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin CCIPClientWithACK ccipClientWithACK //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 From a54d2de5c5c2d482ac6d7d1b2d737a797afd2b33 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 15 Jul 2024 14:43:54 -0400 Subject: [PATCH 42/61] attempted bug fix of CCIPClient fee-token allowance when pre-funding --- contracts/gas-snapshots/ccip.gas-snapshot | 20 +++++++++---------- .../ccip/applications/external/CCIPClient.sol | 3 ++- .../applications/internal/PingPongDemo.sol | 8 ++++---- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 8a37e0e5e1..b99984485f 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -35,9 +35,9 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientTest:test_HappyPath_Success() (gas: 192504) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325792) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218834) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376797) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326914) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219955) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376823) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331795) CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438714) @@ -703,10 +703,10 @@ 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: 307328) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17943) -PingPong_example_plumbing:test_typeAndVersion() (gas: 9745) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 234270) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 179553) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17917) +PingPong_example_plumbing:test_typeAndVersion() (gas: 9786) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203446) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -853,9 +853,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: 289627) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448499) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20203) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 291579) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448569) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) 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/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 6643994325..0ecd1fac0e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -58,7 +58,7 @@ contract CCIPClient is CCIPReceiver { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken - if (address(s_feeToken) != address(0)) { + if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } @@ -77,6 +77,7 @@ contract CCIPClient is CCIPReceiver { /// @dev It has to be external because of the try/catch of ccipReceive() which invokes it function processMessage(Client.Any2EVMMessage calldata message) external + virtual override onlySelf isValidSender(message.sourceChainSelector, message.sender) diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index cadc2cb857..0408d0802a 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; -import {CCIPClientWithACK} from "../external/CCIPClientWithACK.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"; /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication -contract PingPongDemo is CCIPClientWithACK { +contract PingPongDemo is CCIPClient { using SafeERC20 for IERC20; event Ping(uint256 pingPongCount); @@ -24,7 +24,7 @@ contract PingPongDemo is CCIPClientWithACK { bool private s_isPaused; // CCIPClient will handle the token approval so there's no need to do it here - constructor(address router, IERC20 feeToken) CCIPClientWithACK(router, feeToken) {} + constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} function typeAndVersion() external pure virtual returns (string memory) { return "PingPongDemo 1.3.0"; @@ -47,7 +47,7 @@ contract PingPongDemo is CCIPClientWithACK { bytes memory data = abi.encode(pingPongCount); ccipSend({ - destChainSelector: s_counterpartChainSelector, // destChaio + destChainSelector: s_counterpartChainSelector, // destChain tokenAmounts: new Client.EVMTokenAmount[](0), data: data }); From 4312d7422d9b5a4f37bf4a342e3ca93f921c81b8 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, 15 Jul 2024 18:51:21 +0000 Subject: [PATCH 43/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 2 +- .../ping_pong_demo/ping_pong_demo.go | 383 +----------------- .../self_funded_ping_pong.go | 383 +----------------- ...rapper-dependency-versions-do-not-edit.txt | 6 +- 4 files changed, 44 insertions(+), 730 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 345351e6a6..5167ea5517 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -57,7 +57,7 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200433d3803806200433d8339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600880549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613c7780620006c66000396000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103fb578063f2fde38b1461040e578063ff2deec31461042e57600080fd5b8063cf6730f8146103bb578063e4ca8754146103db57600080fd5b8063b0f479a1116100a5578063b0f479a114610350578063c851cc321461037b578063c89245d51461039b57600080fd5b80638da5cb5b146102e45780639fe74e261461033057600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba50971461028f5780638462a2b9146102a457806385572ffb146102c457600080fd5b80636939cd97146102425780636d62d6331461026f57600080fd5b80635075a9d4116101485780635075a9d4146101d2578063536c6bfa146102005780635e35359e1461022257600080fd5b80630e958d6b1461016f57806335f170ef146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612d16565b61045b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004612d9b565b6104a6565b60405161019b929190612e26565b3480156101de57600080fd5b506101f26101ed366004612e54565b6105d2565b60405190815260200161019b565b34801561020c57600080fd5b5061022061021b366004612e8f565b6105e5565b005b34801561022e57600080fd5b5061022061023d366004612ebb565b610649565b34801561024e57600080fd5b5061026261025d366004612e54565b6106de565b60405161019b9190612f59565b34801561027b57600080fd5b5061022061028a366004612fed565b6108e9565b34801561029b57600080fd5b50610220610c03565b3480156102b057600080fd5b506102206102bf366004613069565b610d00565b3480156102d057600080fd5b506102206102df3660046130d5565b611041565b3480156102f057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561033c57600080fd5b5061022061034b366004613110565b61124a565b34801561035c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661030b565b34801561038757600080fd5b50610220610396366004613152565b6115db565b3480156103a757600080fd5b506102206103b6366004613152565b6116a7565b3480156103c757600080fd5b506102206103d63660046130d5565b611811565b3480156103e757600080fd5b506102206103f6366004612e54565b6119ca565b6101f26104093660046132a4565b611c34565b34801561041a57600080fd5b50610220610429366004613152565b612141565b34801561043a57600080fd5b5060085461030b9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061048a90859085906133b1565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104c1906133c1565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed906133c1565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b50505050509080600101805461054f906133c1565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906133c1565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905082565b60006105df600583612155565b92915050565b6105ed612168565b6105f782826121eb565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610651612168565b61067273ffffffffffffffffffffffffffffffffffffffff84168383612345565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106d191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161074d906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610779906133c1565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b505050505081526020016003820180546107df906133c1565b80601f016020809104026020016040519081016040528092919081815260200182805461080b906133c1565b80156108585780601f1061082d57610100808354040283529160200191610858565b820191906000526020600020905b81548152906001019060200180831161083b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108db5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610886565b505050915250909392505050565b6108f1612168565b60016108fe600584612155565b1461093d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61094d8260025b60059190612419565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610995906133c1565b80601f01602080910402602001604051908101604052809291908181526020018280546109c1906133c1565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b50505050508152602001600382018054610a27906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a53906133c1565b8015610aa05780601f10610a7557610100808354040283529160200191610aa0565b820191906000526020600020905b815481529060010190602001808311610a8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ace565b5050505081525050905060005b816080015151811015610bb257610baa8383608001518381518110610b5757610b57613414565b60200260200101516020015184608001518481518110610b7957610b79613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123459092919063ffffffff16565b600101610b30565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610934565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d08612168565b60005b81811015610e9b5760036000848484818110610d2957610d29613414565b9050602002810190610d3b9190613443565b610d49906020810190612d9b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d8057610d80613414565b9050602002810190610d929190613443565b610da0906020810190613481565b604051610dae9291906133b1565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610df557610df5613414565b9050602002810190610e079190613443565b610e15906020810190613481565b604051610e239291906133b1565b6040518091039020838383818110610e3d57610e3d613414565b9050602002810190610e4f9190613443565b610e5d906020810190612d9b565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d0b565b5060005b8381101561103a57600160036000878785818110610ebf57610ebf613414565b9050602002810190610ed19190613443565b610edf906020810190612d9b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f1657610f16613414565b9050602002810190610f289190613443565b610f36906020810190613481565b604051610f449291906133b1565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f9457610f94613414565b9050602002810190610fa69190613443565b610fb4906020810190613481565b604051610fc29291906133b1565b6040518091039020858583818110610fdc57610fdc613414565b9050602002810190610fee9190613443565b610ffc906020810190612d9b565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e9f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611094576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6110a46040820160208301612d9b565b67ffffffffffffffff81166000908152600360205260409020805481906110ca906133c1565b9050600003611111576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061114d9086906004016135e8565b600060405180830381600087803b15801561116757600080fd5b505af1925050508015611178575060015b611218573d8080156111a6576040519150601f19603f3d011682016040523d82523d6000602084013e6111ab565b606091505b506111b884356001610944565b508335600090815260046020526040902084906111d582826139c2565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061120a908490613abc565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611252612168565b60005b818110156112455782828281811061126f5761126f613414565b90506020028101906112819190613acf565b611292906040810190602001613b11565b61135e57600360008484848181106112ac576112ac613414565b90506020028101906112be9190613acf565b6112cc906020810190612d9b565b67ffffffffffffffff168152602081019190915260400160009081206112f191612cb2565b82828281811061130357611303613414565b90506020028101906113159190613acf565b611323906020810190612d9b565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26115d3565b82828281811061137057611370613414565b90506020028101906113829190613acf565b611390906040810190613481565b90506000036113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113e3576113e3613414565b90506020028101906113f59190613acf565b611403906020810190612d9b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061143957611439613414565b905060200281019061144b9190613acf565b611459906040810190613481565b8291611466919083613746565b5083838381811061147957611479613414565b905060200281019061148b9190613acf565b611499906060810190613481565b1590506114e4578383838181106114b2576114b2613414565b90506020028101906114c49190613acf565b6114d2906060810190613481565b60018301916114e2919083613746565b505b8383838181106114f6576114f6613414565b90506020028101906115089190613acf565b611516906040810190613481565b6040516115249291906133b1565b604051809103902084848481811061153e5761153e613414565b90506020028101906115509190613acf565b61155e906020810190612d9b565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061159b5761159b613414565b90506020028101906115ad9190613acf565b6115bb906060810190613481565b6040516115c9929190613b2e565b60405180910390a3505b600101611255565b6115e3612168565b73ffffffffffffffffffffffffffffffffffffffff8116611630576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6116af612168565b60085473ffffffffffffffffffffffffffffffffffffffff1615611710576117106116ef60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff1690600061242e565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156117bd576117bd61177d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6125b0565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461184a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185a6040820160208301612d9b565b6118676040830183613481565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506118be925090506133c1565b159050806119145750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516118ff9190613b42565b9081526040519081900360200190205460ff16155b1561194d57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109349190613abc565b61195d6040840160208501612d9b565b67ffffffffffffffff8116600090815260036020526040902080548190611983906133c1565b905060000361103a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b60016119d7600583612155565b14611a11576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610934565b611a1c816000610944565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611a64906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a90906133c1565b8015611add5780601f10611ab257610100808354040283529160200191611add565b820191906000526020600020905b815481529060010190602001808311611ac057829003601f168201915b50505050508152602001600382018054611af6906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b22906133c1565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611bf25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611b9d565b50505050815250509050611c05816126b4565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c5d906133c1565b9050600003611ca4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611cd4906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d00906133c1565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611dae906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda906133c1565b8015611e275780601f10611dfc57610100808354040283529160200191611e27565b820191906000526020600020905b815481529060010190602001808311611e0a57829003601f168201915b5050505050815250905060005b8651811015611f8457611ea43330898481518110611e5457611e54613414565b6020026020010151602001518a8581518110611e7257611e72613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612726909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611ed457611ed4613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611f7c576002548751611f7c9173ffffffffffffffffffffffffffffffffffffffff1690899084908110611f2d57611f2d613414565b602002602001015160200151898481518110611f4b57611f4b613414565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661242e9092919063ffffffff16565b600101611e34565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611fde908b908690600401613b54565b602060405180830381865afa158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f9190613c21565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612065576008546120659073ffffffffffffffffffffffffffffffffffffffff16333084612726565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612097576000612099565b825b8a856040518463ffffffff1660e01b81526004016120b8929190613b54565b60206040518083038185885af11580156120d6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120fb9190613c21565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161212e91815260200190565b60405180910390a1505050509392505050565b612149612168565b61215281612784565b50565b60006121618383612879565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610934565b565b80471015612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122af576040519150601f19603f3d011682016040523d82523d6000602084013e6122b4565b606091505b5050905080611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612903565b6000612426848484612a0f565b949350505050565b8015806124ce57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cc9190613c21565b155b61255a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612397565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264b9190613c21565b6126559190613c3a565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506126ae9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612397565b50505050565b6126bc612168565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906126f8908490600401612f59565b600060405180830381600087803b15801561271257600080fd5b505af115801561103a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526126ae9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612397565b3373ffffffffffffffffffffffffffffffffffffffff821603612803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610934565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061289d575061289d8484612a2c565b612161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610934565b6000612965826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a389092919063ffffffff16565b80519091501561124557808060200190518101906129839190613c4d565b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610934565b600082815260028401602052604081208290556124268484612a47565b60006121618383612a53565b60606124268484600085612a6b565b60006121618383612b84565b60008181526001830160205260408120541515612161565b606082471015612afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610934565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b269190613b42565b60006040518083038185875af1925050503d8060008114612b63576040519150601f19603f3d011682016040523d82523d6000602084013e612b68565b606091505b5091509150612b7987838387612bd3565b979650505050505050565b6000818152600183016020526040812054612bcb575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105df565b5060006105df565b60608315612c69578251600003612c625773ffffffffffffffffffffffffffffffffffffffff85163b612c62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b5081612426565b6124268383815115612c7e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349190613abc565b508054612cbe906133c1565b6000825580601f10612cce575050565b601f01602090049060005260206000209081019061215291905b80821115612cfc5760008155600101612ce8565b5090565b67ffffffffffffffff8116811461215257600080fd5b600080600060408486031215612d2b57600080fd5b8335612d3681612d00565b9250602084013567ffffffffffffffff80821115612d5357600080fd5b818601915086601f830112612d6757600080fd5b813581811115612d7657600080fd5b876020828501011115612d8857600080fd5b6020830194508093505050509250925092565b600060208284031215612dad57600080fd5b813561216181612d00565b60005b83811015612dd3578181015183820152602001612dbb565b50506000910152565b60008151808452612df4816020860160208601612db8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612e396040830185612ddc565b8281036020840152612e4b8185612ddc565b95945050505050565b600060208284031215612e6657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461215257600080fd5b60008060408385031215612ea257600080fd5b8235612ead81612e6d565b946020939093013593505050565b600080600060608486031215612ed057600080fd5b8335612edb81612e6d565b92506020840135612eeb81612e6d565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612f4e578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612f11565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612f9360c0840182612ddc565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612fcf8383612ddc565b925060808601519150808584030160a086015250612e4b8282612efc565b6000806040838503121561300057600080fd5b82359150602083013561301281612e6d565b809150509250929050565b60008083601f84011261302f57600080fd5b50813567ffffffffffffffff81111561304757600080fd5b6020830191508360208260051b850101111561306257600080fd5b9250929050565b6000806000806040858703121561307f57600080fd5b843567ffffffffffffffff8082111561309757600080fd5b6130a38883890161301d565b909650945060208701359150808211156130bc57600080fd5b506130c98782880161301d565b95989497509550505050565b6000602082840312156130e757600080fd5b813567ffffffffffffffff8111156130fe57600080fd5b820160a0818503121561216157600080fd5b6000806020838503121561312357600080fd5b823567ffffffffffffffff81111561313a57600080fd5b6131468582860161301d565b90969095509350505050565b60006020828403121561316457600080fd5b813561216181612e6d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156131c1576131c161316f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561320e5761320e61316f565b604052919050565b600082601f83011261322757600080fd5b813567ffffffffffffffff8111156132415761324161316f565b61327260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016131c7565b81815284602083860101111561328757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156132b957600080fd5b83356132c481612d00565b925060208481013567ffffffffffffffff808211156132e257600080fd5b818701915087601f8301126132f657600080fd5b8135818111156133085761330861316f565b613316848260051b016131c7565b81815260069190911b8301840190848101908a83111561333557600080fd5b938501935b82851015613381576040858c0312156133535760008081fd5b61335b61319e565b853561336681612e6d565b8152858701358782015282526040909401939085019061333a565b96505050604087013592508083111561339957600080fd5b50506133a786828701613216565b9150509250925092565b8183823760009101908152919050565b600181811c908216806133d557607f821691505b60208210810361340e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261347757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126134b657600080fd5b83018035915067ffffffffffffffff8211156134d157600080fd5b60200191503681900382131561306257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261351b57600080fd5b830160208101925035905067ffffffffffffffff81111561353b57600080fd5b80360382131561306257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612f4e5781356135b681612e6d565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016135a3565b60208152813560208201526000602083013561360381612d00565b67ffffffffffffffff808216604085015261362160408601866134e6565b925060a0606086015261363860c08601848361354a565b92505061364860608601866134e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261367e85838561354a565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126136b757600080fd5b602092880192830192359150838211156136d057600080fd5b8160061b36038313156136e257600080fd5b8685030160a0870152612b79848284613593565b601f821115611245576000816000526020600020601f850160051c8101602086101561371f5750805b601f850160051c820191505b8181101561373e5782815560010161372b565b505050505050565b67ffffffffffffffff83111561375e5761375e61316f565b6137728361376c83546133c1565b836136f6565b6000601f8411600181146137c4576000851561378e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561103a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561381357868501358255602094850194600190920191016137f3565b508682101561384e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561389a81612e6d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156139005761390061316f565b80548382558084101561398d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461394157613941613860565b808616861461395257613952613860565b5060008360005260206000208360011b81018760011b820191505b8082101561398857828255828483015560028201915061396d565b505050505b5060008181526020812083915b8581101561373e576139ac838361388f565b604092909201916002919091019060010161399a565b813581556001810160208301356139d881612d00565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613a186040860186613481565b93509150613a2a838360028701613746565b613a376060860186613481565b93509150613a49838360038701613746565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613a8057600080fd5b918401918235915080821115613a9557600080fd5b506020820191508060061b3603821315613aae57600080fd5b6126ae8183600486016138e7565b6020815260006121616020830184612ddc565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261347757600080fd5b801515811461215257600080fd5b600060208284031215613b2357600080fd5b813561216181613b03565b60208152600061242660208301848661354a565b60008251613477818460208701612db8565b67ffffffffffffffff83168152604060208201526000825160a06040840152613b8060e0840182612ddc565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613bbc8383612ddc565b92506040860151915080858403016080860152613bd98383612efc565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613c178282612ddc565b9695505050505050565b600060208284031215613c3357600080fd5b5051919050565b808201808211156105df576105df613860565b600060208284031215613c5f57600080fd5b815161216181613b0356fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b50604051620043da380380620043da8339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600880549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613d1480620006c66000396000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103fb578063f2fde38b1461040e578063ff2deec31461042e57600080fd5b8063cf6730f8146103bb578063e4ca8754146103db57600080fd5b8063b0f479a1116100a5578063b0f479a114610350578063c851cc321461037b578063c89245d51461039b57600080fd5b80638da5cb5b146102e45780639fe74e261461033057600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba50971461028f5780638462a2b9146102a457806385572ffb146102c457600080fd5b80636939cd97146102425780636d62d6331461026f57600080fd5b80635075a9d4116101485780635075a9d4146101d2578063536c6bfa146102005780635e35359e1461022257600080fd5b80630e958d6b1461016f57806335f170ef146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612db3565b61045b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004612e38565b6104a6565b60405161019b929190612ec3565b3480156101de57600080fd5b506101f26101ed366004612ef1565b6105d2565b60405190815260200161019b565b34801561020c57600080fd5b5061022061021b366004612f2c565b6105e5565b005b34801561022e57600080fd5b5061022061023d366004612f58565b610649565b34801561024e57600080fd5b5061026261025d366004612ef1565b6106de565b60405161019b9190612ff6565b34801561027b57600080fd5b5061022061028a36600461308a565b6108e9565b34801561029b57600080fd5b50610220610c03565b3480156102b057600080fd5b506102206102bf366004613106565b610d00565b3480156102d057600080fd5b506102206102df366004613172565b611041565b3480156102f057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561033c57600080fd5b5061022061034b3660046131ad565b61124a565b34801561035c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661030b565b34801561038757600080fd5b506102206103963660046131ef565b6115db565b3480156103a757600080fd5b506102206103b63660046131ef565b6116a7565b3480156103c757600080fd5b506102206103d6366004613172565b611811565b3480156103e757600080fd5b506102206103f6366004612ef1565b6119ca565b6101f2610409366004613341565b611c34565b34801561041a57600080fd5b506102206104293660046131ef565b6121de565b34801561043a57600080fd5b5060085461030b9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061048a908590859061344e565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104c19061345e565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061345e565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b50505050509080600101805461054f9061345e565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061345e565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905082565b60006105df6005836121f2565b92915050565b6105ed612205565b6105f78282612288565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610651612205565b61067273ffffffffffffffffffffffffffffffffffffffff841683836123e2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106d191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161074d9061345e565b80601f01602080910402602001604051908101604052809291908181526020018280546107799061345e565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b505050505081526020016003820180546107df9061345e565b80601f016020809104026020016040519081016040528092919081815260200182805461080b9061345e565b80156108585780601f1061082d57610100808354040283529160200191610858565b820191906000526020600020905b81548152906001019060200180831161083b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108db5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610886565b505050915250909392505050565b6108f1612205565b60016108fe6005846121f2565b1461093d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61094d8260025b600591906124b6565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916109959061345e565b80601f01602080910402602001604051908101604052809291908181526020018280546109c19061345e565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b50505050508152602001600382018054610a279061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a539061345e565b8015610aa05780601f10610a7557610100808354040283529160200191610aa0565b820191906000526020600020905b815481529060010190602001808311610a8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ace565b5050505081525050905060005b816080015151811015610bb257610baa8383608001518381518110610b5757610b576134b1565b60200260200101516020015184608001518481518110610b7957610b796134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123e29092919063ffffffff16565b600101610b30565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610934565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d08612205565b60005b81811015610e9b5760036000848484818110610d2957610d296134b1565b9050602002810190610d3b91906134e0565b610d49906020810190612e38565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d8057610d806134b1565b9050602002810190610d9291906134e0565b610da090602081019061351e565b604051610dae92919061344e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610df557610df56134b1565b9050602002810190610e0791906134e0565b610e1590602081019061351e565b604051610e2392919061344e565b6040518091039020838383818110610e3d57610e3d6134b1565b9050602002810190610e4f91906134e0565b610e5d906020810190612e38565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d0b565b5060005b8381101561103a57600160036000878785818110610ebf57610ebf6134b1565b9050602002810190610ed191906134e0565b610edf906020810190612e38565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f1657610f166134b1565b9050602002810190610f2891906134e0565b610f3690602081019061351e565b604051610f4492919061344e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f9457610f946134b1565b9050602002810190610fa691906134e0565b610fb490602081019061351e565b604051610fc292919061344e565b6040518091039020858583818110610fdc57610fdc6134b1565b9050602002810190610fee91906134e0565b610ffc906020810190612e38565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e9f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611094576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6110a46040820160208301612e38565b67ffffffffffffffff81166000908152600360205260409020805481906110ca9061345e565b9050600003611111576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061114d908690600401613685565b600060405180830381600087803b15801561116757600080fd5b505af1925050508015611178575060015b611218573d8080156111a6576040519150601f19603f3d011682016040523d82523d6000602084013e6111ab565b606091505b506111b884356001610944565b508335600090815260046020526040902084906111d58282613a5f565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061120a908490613b59565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611252612205565b60005b818110156112455782828281811061126f5761126f6134b1565b90506020028101906112819190613b6c565b611292906040810190602001613bae565b61135e57600360008484848181106112ac576112ac6134b1565b90506020028101906112be9190613b6c565b6112cc906020810190612e38565b67ffffffffffffffff168152602081019190915260400160009081206112f191612d4f565b828282818110611303576113036134b1565b90506020028101906113159190613b6c565b611323906020810190612e38565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26115d3565b828282818110611370576113706134b1565b90506020028101906113829190613b6c565b61139090604081019061351e565b90506000036113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113e3576113e36134b1565b90506020028101906113f59190613b6c565b611403906020810190612e38565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611439576114396134b1565b905060200281019061144b9190613b6c565b61145990604081019061351e565b82916114669190836137e3565b50838383818110611479576114796134b1565b905060200281019061148b9190613b6c565b61149990606081019061351e565b1590506114e4578383838181106114b2576114b26134b1565b90506020028101906114c49190613b6c565b6114d290606081019061351e565b60018301916114e29190836137e3565b505b8383838181106114f6576114f66134b1565b90506020028101906115089190613b6c565b61151690604081019061351e565b60405161152492919061344e565b604051809103902084848481811061153e5761153e6134b1565b90506020028101906115509190613b6c565b61155e906020810190612e38565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061159b5761159b6134b1565b90506020028101906115ad9190613b6c565b6115bb90606081019061351e565b6040516115c9929190613bcb565b60405180910390a3505b600101611255565b6115e3612205565b73ffffffffffffffffffffffffffffffffffffffff8116611630576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6116af612205565b60085473ffffffffffffffffffffffffffffffffffffffff1615611710576117106116ef60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006124cb565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156117bd576117bd61177d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61264d565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461184a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185a6040820160208301612e38565b611867604083018361351e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506118be9250905061345e565b159050806119145750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516118ff9190613bdf565b9081526040519081900360200190205460ff16155b1561194d57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109349190613b59565b61195d6040840160208501612e38565b67ffffffffffffffff81166000908152600360205260409020805481906119839061345e565b905060000361103a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b60016119d76005836121f2565b14611a11576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610934565b611a1c816000610944565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611a649061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a909061345e565b8015611add5780601f10611ab257610100808354040283529160200191611add565b820191906000526020600020905b815481529060010190602001808311611ac057829003601f168201915b50505050508152602001600382018054611af69061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b229061345e565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611bf25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611b9d565b50505050815250509050611c0581612751565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c5d9061345e565b9050600003611ca4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611cd49061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d009061345e565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611dae9061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda9061345e565b8015611e275780601f10611dfc57610100808354040283529160200191611e27565b820191906000526020600020905b815481529060010190602001808311611e0a57829003601f168201915b5050505050815250905060005b8651811015611f8457611ea43330898481518110611e5457611e546134b1565b6020026020010151602001518a8581518110611e7257611e726134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127c3909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611ed457611ed46134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611f7c576002548751611f7c9173ffffffffffffffffffffffffffffffffffffffff1690899084908110611f2d57611f2d6134b1565b602002602001015160200151898481518110611f4b57611f4b6134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124cb9092919063ffffffff16565b600101611e34565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611fde908b908690600401613bf1565b602060405180830381865afa158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f9190613cbe565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906120d857506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d69190613cbe565b105b15612102576008546121029073ffffffffffffffffffffffffffffffffffffffff163330846127c3565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612134576000612136565b825b8a856040518463ffffffff1660e01b8152600401612155929190613bf1565b60206040518083038185885af1158015612173573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121989190613cbe565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516121cb91815260200190565b60405180910390a1505050509392505050565b6121e6612205565b6121ef81612821565b50565b60006121fe8383612916565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610934565b565b804710156122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461234c576040519150601f19603f3d011682016040523d82523d6000602084013e612351565b606091505b5050905080611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526129a0565b60006124c3848484612aac565b949350505050565b80158061256b57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125699190613cbe565b155b6125f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612434565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190613cbe565b6126f29190613cd7565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061274b9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612434565b50505050565b612759612205565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612795908490600401612ff6565b600060405180830381600087803b1580156127af57600080fd5b505af115801561103a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261274b9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612434565b3373ffffffffffffffffffffffffffffffffffffffff8216036128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610934565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061293a575061293a8484612ac9565b6121fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610934565b6000612a02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ad59092919063ffffffff16565b8051909150156112455780806020019051810190612a209190613cea565b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610934565b600082815260028401602052604081208290556124c38484612ae4565b60006121fe8383612af0565b60606124c38484600085612b08565b60006121fe8383612c21565b600081815260018301602052604081205415156121fe565b606082471015612b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610934565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612bc39190613bdf565b60006040518083038185875af1925050503d8060008114612c00576040519150601f19603f3d011682016040523d82523d6000602084013e612c05565b606091505b5091509150612c1687838387612c70565b979650505050505050565b6000818152600183016020526040812054612c68575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105df565b5060006105df565b60608315612d06578251600003612cff5773ffffffffffffffffffffffffffffffffffffffff85163b612cff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b50816124c3565b6124c38383815115612d1b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349190613b59565b508054612d5b9061345e565b6000825580601f10612d6b575050565b601f0160209004906000526020600020908101906121ef91905b80821115612d995760008155600101612d85565b5090565b67ffffffffffffffff811681146121ef57600080fd5b600080600060408486031215612dc857600080fd5b8335612dd381612d9d565b9250602084013567ffffffffffffffff80821115612df057600080fd5b818601915086601f830112612e0457600080fd5b813581811115612e1357600080fd5b876020828501011115612e2557600080fd5b6020830194508093505050509250925092565b600060208284031215612e4a57600080fd5b81356121fe81612d9d565b60005b83811015612e70578181015183820152602001612e58565b50506000910152565b60008151808452612e91816020860160208601612e55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612ed66040830185612e79565b8281036020840152612ee88185612e79565b95945050505050565b600060208284031215612f0357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146121ef57600080fd5b60008060408385031215612f3f57600080fd5b8235612f4a81612f0a565b946020939093013593505050565b600080600060608486031215612f6d57600080fd5b8335612f7881612f0a565b92506020840135612f8881612f0a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612feb578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fae565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303060c0840182612e79565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261306c8383612e79565b925060808601519150808584030160a086015250612ee88282612f99565b6000806040838503121561309d57600080fd5b8235915060208301356130af81612f0a565b809150509250929050565b60008083601f8401126130cc57600080fd5b50813567ffffffffffffffff8111156130e457600080fd5b6020830191508360208260051b85010111156130ff57600080fd5b9250929050565b6000806000806040858703121561311c57600080fd5b843567ffffffffffffffff8082111561313457600080fd5b613140888389016130ba565b9096509450602087013591508082111561315957600080fd5b50613166878288016130ba565b95989497509550505050565b60006020828403121561318457600080fd5b813567ffffffffffffffff81111561319b57600080fd5b820160a081850312156121fe57600080fd5b600080602083850312156131c057600080fd5b823567ffffffffffffffff8111156131d757600080fd5b6131e3858286016130ba565b90969095509350505050565b60006020828403121561320157600080fd5b81356121fe81612f0a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561325e5761325e61320c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132ab576132ab61320c565b604052919050565b600082601f8301126132c457600080fd5b813567ffffffffffffffff8111156132de576132de61320c565b61330f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613264565b81815284602083860101111561332457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561335657600080fd5b833561336181612d9d565b925060208481013567ffffffffffffffff8082111561337f57600080fd5b818701915087601f83011261339357600080fd5b8135818111156133a5576133a561320c565b6133b3848260051b01613264565b81815260069190911b8301840190848101908a8311156133d257600080fd5b938501935b8285101561341e576040858c0312156133f05760008081fd5b6133f861323b565b853561340381612f0a565b815285870135878201528252604090940193908501906133d7565b96505050604087013592508083111561343657600080fd5b5050613444868287016132b3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061347257607f821691505b6020821081036134ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261351457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261355357600080fd5b83018035915067ffffffffffffffff82111561356e57600080fd5b6020019150368190038213156130ff57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135b857600080fd5b830160208101925035905067ffffffffffffffff8111156135d857600080fd5b8036038213156130ff57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612feb57813561365381612f0a565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613640565b6020815281356020820152600060208301356136a081612d9d565b67ffffffffffffffff80821660408501526136be6040860186613583565b925060a060608601526136d560c0860184836135e7565b9250506136e56060860186613583565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261371b8583856135e7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261375457600080fd5b6020928801928301923591508382111561376d57600080fd5b8160061b360383131561377f57600080fd5b8685030160a0870152612c16848284613630565b601f821115611245576000816000526020600020601f850160051c810160208610156137bc5750805b601f850160051c820191505b818110156137db578281556001016137c8565b505050505050565b67ffffffffffffffff8311156137fb576137fb61320c565b61380f83613809835461345e565b83613793565b6000601f841160018114613861576000851561382b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561103a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156138b05786850135825560209485019460019092019101613890565b50868210156138eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561393781612f0a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561399d5761399d61320c565b805483825580841015613a2a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146139de576139de6138fd565b80861686146139ef576139ef6138fd565b5060008360005260206000208360011b81018760011b820191505b80821015613a25578282558284830155600282019150613a0a565b505050505b5060008181526020812083915b858110156137db57613a49838361392c565b6040929092019160029190910190600101613a37565b81358155600181016020830135613a7581612d9d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ab5604086018661351e565b93509150613ac78383600287016137e3565b613ad4606086018661351e565b93509150613ae68383600387016137e3565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b1d57600080fd5b918401918235915080821115613b3257600080fd5b506020820191508060061b3603821315613b4b57600080fd5b61274b818360048601613984565b6020815260006121fe6020830184612e79565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261351457600080fd5b80151581146121ef57600080fd5b600060208284031215613bc057600080fd5b81356121fe81613ba0565b6020815260006124c36020830184866135e7565b60008251613514818460208701612e55565b67ffffffffffffffff83168152604060208201526000825160a06040840152613c1d60e0840182612e79565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613c598383612e79565b92506040860151915080858403016080860152613c768383612f99565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613cb48282612e79565b9695505050505050565b600060208284031215613cd057600080fd5b5051919050565b808201808211156105df576105df6138fd565b600060208284031215613cfc57600080fd5b81516121fe81613ba056fea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index 44e8554799..c0d5b71cc9 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bbf38038062004bbf83398101604081905262000034916200056d565b8181818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000149565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013d576200013d6001600160a01b03821683600019620001f4565b50505050505062000692565b336001600160a01b03821603620001a35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c9190620005ac565b620002789190620005c6565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d491869190620002da16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000329906001600160a01b038516908490620003b0565b805190915015620003ab57808060200190518101906200034a9190620005ee565b620003ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b505050565b6060620003c18484600085620003c9565b949350505050565b6060824710156200042c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b031685876040516200044a91906200063f565b60006040518083038185875af1925050503d806000811462000489576040519150601f19603f3d011682016040523d82523d6000602084013e6200048e565b606091505b509092509050620004a287838387620004ad565b979650505050505050565b606083156200052157825160000362000519576001600160a01b0385163b620005195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b5081620003c1565b620003c18383815115620005385781518083602001fd5b8060405162461bcd60e51b81526004016200008891906200065d565b6001600160a01b03811681146200056a57600080fd5b50565b600080604083850312156200058157600080fd5b82516200058e8162000554565b6020840151909250620005a18162000554565b809150509250929050565b600060208284031215620005bf57600080fd5b5051919050565b80820180821115620005e857634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200060157600080fd5b815180151581146200061257600080fd5b9392505050565b60005b83811015620006365781810151838201526020016200061c565b50506000910152565b600082516200065381846020870162000619565b9190910192915050565b60208152600082518060208401526200067e81604085016020870162000619565b601f01601f19169190910160400192915050565b61451d80620006a26000396000f3fe6080604052600436106101dc5760003560e01c80638462a2b911610102578063bee518a411610095578063e4ca875411610064578063e4ca87541461065a578063e89b44851461067a578063f2fde38b1461068d578063ff2deec3146106ad57600080fd5b8063bee518a4146105d1578063c851cc32146105fa578063c89245d51461061a578063cf6730f81461063a57600080fd5b80639fe74e26116100d15780639fe74e261461052e578063b0f479a11461054e578063b187bd2614610579578063b5a11011146105b157600080fd5b80638462a2b9146104a357806385572ffb146104c35780638da5cb5b146104e35780639d2aede51461050e57600080fd5b806335f170ef1161017a5780636939cd97116101495780636939cd97146103f85780636d62d633146104255780636fef519e1461044557806379ba50971461048e57600080fd5b806335f170ef1461035c5780635075a9d41461038a578063536c6bfa146103b85780635e35359e146103d857600080fd5b8063181f5a77116101b6578063181f5a77146102805780631892b906146102cf5780632874d8bf146102ef5780632b6e5d631461030457600080fd5b806305bfe982146101e85780630e958d6b1461022e57806316c38b3c1461025e57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610218610203366004613425565b60096020526000908152604090205460ff1681565b604051610225919061343e565b60405180910390f35b34801561023a57600080fd5b5061024e610249366004613495565b6106da565b6040519015158152602001610225565b34801561026a57600080fd5b5061027e610279366004613528565b610725565b005b34801561028c57600080fd5b5060408051808201909152601281527f50696e67506f6e6744656d6f20312e332e30000000000000000000000000000060208201525b60405161022591906135b3565b3480156102db57600080fd5b5061027e6102ea3660046135c6565b61077f565b3480156102fb57600080fd5b5061027e6107c2565b34801561031057600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561036857600080fd5b5061037c6103773660046135c6565b6107fe565b6040516102259291906135e3565b34801561039657600080fd5b506103aa6103a5366004613425565b61092a565b604051908152602001610225565b3480156103c457600080fd5b5061027e6103d3366004613633565b61093d565b3480156103e457600080fd5b5061027e6103f336600461365f565b6109a1565b34801561040457600080fd5b50610418610413366004613425565b610a36565b60405161022591906136fd565b34801561043157600080fd5b5061027e610440366004613791565b610c41565b34801561045157600080fd5b506102c26040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b34801561049a57600080fd5b5061027e610f5b565b3480156104af57600080fd5b5061027e6104be36600461380d565b611058565b3480156104cf57600080fd5b5061027e6104de366004613879565b611399565b3480156104ef57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610337565b34801561051a57600080fd5b5061027e6105293660046138b4565b6115a2565b34801561053a57600080fd5b5061027e6105493660046138d1565b61165d565b34801561055a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610337565b34801561058557600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661024e565b3480156105bd57600080fd5b5061027e6105cc366004613913565b6119ee565b3480156105dd57600080fd5b50600a5460405167ffffffffffffffff9091168152602001610225565b34801561060657600080fd5b5061027e6106153660046138b4565b611b5e565b34801561062657600080fd5b5061027e6106353660046138b4565b611c2a565b34801561064657600080fd5b5061027e610655366004613879565b611d9e565b34801561066657600080fd5b5061027e610675366004613425565b611fbb565b6103aa610688366004613a76565b612225565b34801561069957600080fd5b5061027e6106a83660046138b4565b61275b565b3480156106b957600080fd5b506008546103379073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107099085908590613b83565b9081526040519081900360200190205460ff1690509392505050565b61072d61276f565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b61078761276f565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6107ca61276f565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556107fc60016127f0565b565b60036020526000908152604090208054819061081990613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613b93565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050908060010180546108a790613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546108d390613b93565b80156109205780601f106108f557610100808354040283529160200191610920565b820191906000526020600020905b81548152906001019060200180831161090357829003601f168201915b5050505050905082565b60006109376005836128fd565b92915050565b61094561276f565b61094f8282612910565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109a961276f565b6109ca73ffffffffffffffffffffffffffffffffffffffff84168383612a6a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a2991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610aa590613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad190613b93565b8015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b50505050508152602001600382018054610b3790613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613b93565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c335760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610bde565b505050915250909392505050565b610c4961276f565b6001610c566005846128fd565b14610c95576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610ca58260025b60059190612b3e565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610ced90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1990613b93565b8015610d665780601f10610d3b57610100808354040283529160200191610d66565b820191906000526020600020905b815481529060010190602001808311610d4957829003601f168201915b50505050508152602001600382018054610d7f90613b93565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab90613b93565b8015610df85780601f10610dcd57610100808354040283529160200191610df8565b820191906000526020600020905b815481529060010190602001808311610ddb57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e7b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e26565b5050505081525050905060005b816080015151811015610f0a57610f028383608001518381518110610eaf57610eaf613be6565b60200260200101516020015184608001518481518110610ed157610ed1613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a6a9092919063ffffffff16565b600101610e88565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c8c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61106061276f565b60005b818110156111f3576003600084848481811061108157611081613be6565b90506020028101906110939190613c15565b6110a19060208101906135c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110d8576110d8613be6565b90506020028101906110ea9190613c15565b6110f8906020810190613c53565b604051611106929190613b83565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061114d5761114d613be6565b905060200281019061115f9190613c15565b61116d906020810190613c53565b60405161117b929190613b83565b604051809103902083838381811061119557611195613be6565b90506020028101906111a79190613c15565b6111b59060208101906135c6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611063565b5060005b838110156113925760016003600087878581811061121757611217613be6565b90506020028101906112299190613c15565b6112379060208101906135c6565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061126e5761126e613be6565b90506020028101906112809190613c15565b61128e906020810190613c53565b60405161129c929190613b83565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106112ec576112ec613be6565b90506020028101906112fe9190613c15565b61130c906020810190613c53565b60405161131a929190613b83565b604051809103902085858381811061133457611334613be6565b90506020028101906113469190613c15565b6113549060208101906135c6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016111f7565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146113ec576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c8c565b6113fc60408201602083016135c6565b67ffffffffffffffff811660009081526003602052604090208054819061142290613b93565b9050600003611469576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c8c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114a5908690600401613dba565b600060405180830381600087803b1580156114bf57600080fd5b505af19250505080156114d0575060015b611570573d8080156114fe576040519150601f19603f3d011682016040523d82523d6000602084013e611503565b606091505b5061151084356001610c9c565b5083356000908152600460205260409020849061152d828261418c565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906115629084906135b3565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6115aa61276f565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906116599082614286565b5050565b61166561276f565b60005b8181101561159d5782828281811061168257611682613be6565b905060200281019061169491906143a0565b6116a5906040810190602001613528565b61177157600360008484848181106116bf576116bf613be6565b90506020028101906116d191906143a0565b6116df9060208101906135c6565b67ffffffffffffffff16815260208101919091526040016000908120611704916133d7565b82828281811061171657611716613be6565b905060200281019061172891906143a0565b6117369060208101906135c6565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26119e6565b82828281811061178357611783613be6565b905060200281019061179591906143a0565b6117a3906040810190613c53565b90506000036117de576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106117f6576117f6613be6565b905060200281019061180891906143a0565b6118169060208101906135c6565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020905083838381811061184c5761184c613be6565b905060200281019061185e91906143a0565b61186c906040810190613c53565b8291611879919083613f10565b5083838381811061188c5761188c613be6565b905060200281019061189e91906143a0565b6118ac906060810190613c53565b1590506118f7578383838181106118c5576118c5613be6565b90506020028101906118d791906143a0565b6118e5906060810190613c53565b60018301916118f5919083613f10565b505b83838381811061190957611909613be6565b905060200281019061191b91906143a0565b611929906040810190613c53565b604051611937929190613b83565b604051809103902084848481811061195157611951613be6565b905060200281019061196391906143a0565b6119719060208101906135c6565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106119ae576119ae613be6565b90506020028101906119c091906143a0565b6119ce906060810190613c53565b6040516119dc9291906143d4565b60405180910390a3505b600101611668565b6119f661276f565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611ab1916143e8565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061159d9082614286565b611b6661276f565b73ffffffffffffffffffffffffffffffffffffffff8116611bb3576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611c3261276f565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c9357611c93611c7260025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b53565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611d4057611d40611d0060025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612cd5565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611dd7576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611de760408201602083016135c6565b611df46040830183613c53565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611e4b92509050613b93565b15905080611ea15750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e8c91906143e8565b9081526040519081900360200190205460ff16155b15611eda57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c8c91906135b3565b611eea60408401602085016135c6565b67ffffffffffffffff8116600090815260036020526040902080548190611f1090613b93565b9050600003611f57576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c8c565b6000611f666060870187613c53565b810190611f739190613425565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff16611fb357611fb3611fae8260016143fa565b6127f0565b505050505050565b6001611fc86005836128fd565b14612002576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c8c565b61200d816000610c9c565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161205590613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461208190613b93565b80156120ce5780601f106120a3576101008083540402835291602001916120ce565b820191906000526020600020905b8154815290600101906020018083116120b157829003601f168201915b505050505081526020016003820180546120e790613b93565b80601f016020809104026020016040519081016040528092919081815260200182805461211390613b93565b80156121605780601f1061213557610100808354040283529160200191612160565b820191906000526020600020905b81548152906001019060200180831161214357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156121e35760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161218e565b505050508152505090506121f681612dd9565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061224e90613b93565b9050600003612295576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c8c565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906122c590613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546122f190613b93565b801561233e5780601f106123135761010080835404028352916020019161233e565b820191906000526020600020905b81548152906001019060200180831161232157829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161239f90613b93565b80601f01602080910402602001604051908101604052809291908181526020018280546123cb90613b93565b80156124185780601f106123ed57610100808354040283529160200191612418565b820191906000526020600020905b8154815290600101906020018083116123fb57829003601f168201915b5050505050815250905060005b865181101561257557612495333089848151811061244557612445613be6565b6020026020010151602001518a858151811061246357612463613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e4b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106124c5576124c5613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461256d57600254875161256d9173ffffffffffffffffffffffffffffffffffffffff169089908490811061251e5761251e613be6565b60200260200101516020015189848151811061253c5761253c613be6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b539092919063ffffffff16565b600101612425565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906125cf908b90869060040161440d565b602060405180830381865afa1580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261091906144da565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612656576008546126569073ffffffffffffffffffffffffffffffffffffffff16333084612e4b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561268857600061268a565b825b8a856040518463ffffffff1660e01b81526004016126a992919061440d565b60206040518083038185885af11580156126c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126ec91906144da565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61276361276f565b61276c81612ea9565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c8c565b80600116600103612833576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612867565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161287c91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600a5460008085526020850190935290935061159d9267ffffffffffffffff909116916128f6565b60408051808201909152600080825260208201528152602001906001900390816128cf5790505b5083612225565b60006129098383612f9e565b9392505050565b8047101561297a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c8c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b505090508061159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c8c565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261159d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613028565b6000612b4b848484613134565b949350505050565b801580612bf357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf191906144da565b155b612c7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c8c565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261159d9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612abc565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7091906144da565b612d7a91906143fa565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612dd39085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612abc565b50505050565b612de161276f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e1d9084906004016136fd565b600060405180830381600087803b158015612e3757600080fd5b505af1158015611392573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612dd39085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612abc565b3373ffffffffffffffffffffffffffffffffffffffff821603612f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c8c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612fc25750612fc28484613151565b612909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c8c565b600061308a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661315d9092919063ffffffff16565b80519091501561159d57808060200190518101906130a891906144f3565b61159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c8c565b60008281526002840160205260408120829055612b4b848461316c565b60006129098383613178565b6060612b4b8484600085613190565b600061290983836132a9565b60008181526001830160205260408120541515612909565b606082471015613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c8c565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161324b91906143e8565b60006040518083038185875af1925050503d8060008114613288576040519150601f19603f3d011682016040523d82523d6000602084013e61328d565b606091505b509150915061329e878383876132f8565b979650505050505050565b60008181526001830160205260408120546132f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610937565b506000610937565b6060831561338e5782516000036133875773ffffffffffffffffffffffffffffffffffffffff85163b613387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c8c565b5081612b4b565b612b4b83838151156133a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c91906135b3565b5080546133e390613b93565b6000825580601f106133f3575050565b601f01602090049060005260206000209081019061276c91905b80821115613421576000815560010161340d565b5090565b60006020828403121561343757600080fd5b5035919050565b6020810160038310613479577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461276c57600080fd5b6000806000604084860312156134aa57600080fd5b83356134b58161347f565b9250602084013567ffffffffffffffff808211156134d257600080fd5b818601915086601f8301126134e657600080fd5b8135818111156134f557600080fd5b87602082850101111561350757600080fd5b6020830194508093505050509250925092565b801515811461276c57600080fd5b60006020828403121561353a57600080fd5b81356129098161351a565b60005b83811015613560578181015183820152602001613548565b50506000910152565b60008151808452613581816020860160208601613545565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129096020830184613569565b6000602082840312156135d857600080fd5b81356129098161347f565b6040815260006135f66040830185613569565b82810360208401526136088185613569565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461276c57600080fd5b6000806040838503121561364657600080fd5b823561365181613611565b946020939093013593505050565b60008060006060848603121561367457600080fd5b833561367f81613611565b9250602084013561368f81613611565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261373760c0840182613569565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137738383613569565b925060808601519150808584030160a08601525061360882826136a0565b600080604083850312156137a457600080fd5b8235915060208301356137b681613611565b809150509250929050565b60008083601f8401126137d357600080fd5b50813567ffffffffffffffff8111156137eb57600080fd5b6020830191508360208260051b850101111561380657600080fd5b9250929050565b6000806000806040858703121561382357600080fd5b843567ffffffffffffffff8082111561383b57600080fd5b613847888389016137c1565b9096509450602087013591508082111561386057600080fd5b5061386d878288016137c1565b95989497509550505050565b60006020828403121561388b57600080fd5b813567ffffffffffffffff8111156138a257600080fd5b820160a0818503121561290957600080fd5b6000602082840312156138c657600080fd5b813561290981613611565b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b613907858286016137c1565b90969095509350505050565b6000806040838503121561392657600080fd5b82356139318161347f565b915060208301356137b681613611565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561399357613993613941565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e0576139e0613941565b604052919050565b600082601f8301126139f957600080fd5b813567ffffffffffffffff811115613a1357613a13613941565b613a4460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613999565b818152846020838601011115613a5957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8b57600080fd5b8335613a968161347f565b925060208481013567ffffffffffffffff80821115613ab457600080fd5b818701915087601f830112613ac857600080fd5b813581811115613ada57613ada613941565b613ae8848260051b01613999565b81815260069190911b8301840190848101908a831115613b0757600080fd5b938501935b82851015613b53576040858c031215613b255760008081fd5b613b2d613970565b8535613b3881613611565b81528587013587820152825260409094019390850190613b0c565b965050506040870135925080831115613b6b57600080fd5b5050613b79868287016139e8565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613ba757607f821691505b602082108103613be0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c4957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c8857600080fd5b83018035915067ffffffffffffffff821115613ca357600080fd5b60200191503681900382131561380657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ced57600080fd5b830160208101925035905067ffffffffffffffff811115613d0d57600080fd5b80360382131561380657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136f2578135613d8881613611565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d75565b602081528135602082015260006020830135613dd58161347f565b67ffffffffffffffff8082166040850152613df36040860186613cb8565b925060a06060860152613e0a60c086018483613d1c565b925050613e1a6060860186613cb8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e50858385613d1c565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e8957600080fd5b60209288019283019235915083821115613ea257600080fd5b8160061b3603831315613eb457600080fd5b8685030160a087015261329e848284613d65565b601f82111561159d576000816000526020600020601f850160051c81016020861015613ef15750805b601f850160051c820191505b81811015611fb357828155600101613efd565b67ffffffffffffffff831115613f2857613f28613941565b613f3c83613f368354613b93565b83613ec8565b6000601f841160018114613f8e5760008515613f585750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611392565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fdd5786850135825560209485019460019092019101613fbd565b5086821015614018577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561406481613611565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140ca576140ca613941565b8054838255808410156141575760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410b5761410b61402a565b808616861461411c5761411c61402a565b5060008360005260206000208360011b81018760011b820191505b80821015614152578282558284830155600282019150614137565b505050505b5060008181526020812083915b85811015611fb3576141768383614059565b6040929092019160029190910190600101614164565b813581556001810160208301356141a28161347f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141e26040860186613c53565b935091506141f4838360028701613f10565b6142016060860186613c53565b93509150614213838360038701613f10565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424a57600080fd5b91840191823591508082111561425f57600080fd5b506020820191508060061b360382131561427857600080fd5b612dd38183600486016140b1565b815167ffffffffffffffff8111156142a0576142a0613941565b6142b4816142ae8454613b93565b84613ec8565b602080601f83116001811461430757600084156142d15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611fb3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561435457888601518255948401946001909101908401614335565b508582101561439057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c4957600080fd5b602081526000612b4b602083018486613d1c565b60008251613c49818460208701613545565b808201808211156109375761093761402a565b67ffffffffffffffff83168152604060208201526000825160a0604084015261443960e0840182613569565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144758383613569565b9250604086015191508085840301608086015261449283836136a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144d08282613569565b9695505050505050565b6000602082840312156144ec57600080fd5b5051919050565b60006020828403121561450557600080fd5b81516129098161351a56fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bda38038062004bda8339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b61451080620006ca6000396000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063e4ca875411610064578063e4ca8754146105c5578063e89b4485146105e5578063f2fde38b146105f8578063ff2deec31461061857600080fd5b8063bee518a41461051a578063c851cc3214610565578063c89245d514610585578063cf6730f8146105a557600080fd5b80639fe74e26116100d15780639fe74e261461047f578063b0f479a11461049f578063b187bd26146104ca578063b5a11011146104fa57600080fd5b806385572ffb146104145780638da5cb5b146104345780639d2aede51461045f57600080fd5b80635075a9d4116101645780636939cd971161013e5780636939cd97146103925780636d62d633146103bf57806379ba5097146103df5780638462a2b9146103f457600080fd5b80635075a9d414610324578063536c6bfa146103525780635e35359e1461037257600080fd5b80631892b906116101a05780631892b906146102755780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630e958d6b146101d257806316c38b3c14610207578063181f5a771461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed36600461346f565b610645565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004613502565b610690565b005b34801561023557600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e332e300000000000000000000000000000602082015290516101fe919061358d565b34801561028157600080fd5b506102276102903660046135a0565b6106e2565b3480156102a157600080fd5b5061022761073d565b3480156102b657600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b506103166103113660046135a0565b610779565b6040516101fe9291906135bd565b34801561033057600080fd5b5061034461033f3660046135eb565b6108a5565b6040519081526020016101fe565b34801561035e57600080fd5b5061022761036d366004613626565b6108b8565b34801561037e57600080fd5b5061022761038d366004613652565b61091c565b34801561039e57600080fd5b506103b26103ad3660046135eb565b6109b1565b6040516101fe91906136f0565b3480156103cb57600080fd5b506102276103da366004613784565b610bbc565b3480156103eb57600080fd5b50610227610ed6565b34801561040057600080fd5b5061022761040f366004613800565b610fd3565b34801561042057600080fd5b5061022761042f36600461386c565b611314565b34801561044057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561046b57600080fd5b5061022761047a3660046138a7565b61151d565b34801561048b57600080fd5b5061022761049a3660046138c4565b6115e2565b3480156104ab57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104d657600080fd5b5060095474010000000000000000000000000000000000000000900460ff166101f2565b34801561050657600080fd5b50610227610515366004613906565b611973565b34801561052657600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561057157600080fd5b506102276105803660046138a7565b611b19565b34801561059157600080fd5b506102276105a03660046138a7565b611be5565b3480156105b157600080fd5b506102276105c036600461386c565b611d4f565b3480156105d157600080fd5b506102276105e03660046135eb565b611f64565b6103446105f3366004613a69565b6121ce565b34801561060457600080fd5b506102276106133660046138a7565b612778565b34801561062457600080fd5b506008546102d19073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106749085908590613b76565b9081526040519081900360200190205460ff1690509392505050565b61069861278c565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106ea61278c565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61074561278c565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055610777600161280d565b565b60036020526000908152604090208054819061079490613b86565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090613b86565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509080600101805461082290613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613b86565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905082565b60006108b2600583612931565b92915050565b6108c061278c565b6108ca8282612944565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61092461278c565b61094573ffffffffffffffffffffffffffffffffffffffff84168383612a9e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a2090613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90613b86565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b86565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b59565b505050915250909392505050565b610bc461278c565b6001610bd1600584612931565b14610c10576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c208260025b60059190612b72565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c6890613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9490613b86565b8015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b50505050508152602001600382018054610cfa90613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690613b86565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610df65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610da1565b5050505081525050905060005b816080015151811015610e8557610e7d8383608001518381518110610e2a57610e2a613bd9565b60200260200101516020015184608001518481518110610e4c57610e4c613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a9e9092919063ffffffff16565b600101610e03565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c07565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fdb61278c565b60005b8181101561116e5760036000848484818110610ffc57610ffc613bd9565b905060200281019061100e9190613c08565b61101c9060208101906135a0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061105357611053613bd9565b90506020028101906110659190613c08565b611073906020810190613c46565b604051611081929190613b76565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110c8576110c8613bd9565b90506020028101906110da9190613c08565b6110e8906020810190613c46565b6040516110f6929190613b76565b604051809103902083838381811061111057611110613bd9565b90506020028101906111229190613c08565b6111309060208101906135a0565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610fde565b5060005b8381101561130d5760016003600087878581811061119257611192613bd9565b90506020028101906111a49190613c08565b6111b29060208101906135a0565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106111e9576111e9613bd9565b90506020028101906111fb9190613c08565b611209906020810190613c46565b604051611217929190613b76565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061126757611267613bd9565b90506020028101906112799190613c08565b611287906020810190613c46565b604051611295929190613b76565b60405180910390208585838181106112af576112af613bd9565b90506020028101906112c19190613c08565b6112cf9060208101906135a0565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611172565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611367576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c07565b61137760408201602083016135a0565b67ffffffffffffffff811660009081526003602052604090208054819061139d90613b86565b90506000036113e4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611420908690600401613dad565b600060405180830381600087803b15801561143a57600080fd5b505af192505050801561144b575060015b6114eb573d808015611479576040519150601f19603f3d011682016040523d82523d6000602084013e61147e565b606091505b5061148b84356001610c17565b508335600090815260046020526040902084906114a8828261417f565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906114dd90849061358d565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61152561278c565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906115de9082614279565b5050565b6115ea61278c565b60005b818110156115185782828281811061160757611607613bd9565b90506020028101906116199190614393565b61162a906040810190602001613502565b6116f6576003600084848481811061164457611644613bd9565b90506020028101906116569190614393565b6116649060208101906135a0565b67ffffffffffffffff168152602081019190915260400160009081206116899161340b565b82828281811061169b5761169b613bd9565b90506020028101906116ad9190614393565b6116bb9060208101906135a0565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261196b565b82828281811061170857611708613bd9565b905060200281019061171a9190614393565b611728906040810190613c46565b9050600003611763576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061177b5761177b613bd9565b905060200281019061178d9190614393565b61179b9060208101906135a0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106117d1576117d1613bd9565b90506020028101906117e39190614393565b6117f1906040810190613c46565b82916117fe919083613f03565b5083838381811061181157611811613bd9565b90506020028101906118239190614393565b611831906060810190613c46565b15905061187c5783838381811061184a5761184a613bd9565b905060200281019061185c9190614393565b61186a906060810190613c46565b600183019161187a919083613f03565b505b83838381811061188e5761188e613bd9565b90506020028101906118a09190614393565b6118ae906040810190613c46565b6040516118bc929190613b76565b60405180910390208484848181106118d6576118d6613bd9565b90506020028101906118e89190614393565b6118f69060208101906135a0565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061193357611933613bd9565b90506020028101906119459190614393565b611953906060810190613c46565b6040516119619291906143c7565b60405180910390a3505b6001016115ed565b61197b61278c565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a6c916143db565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115189082614279565b611b2161278c565b73ffffffffffffffffffffffffffffffffffffffff8116611b6e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611bed61278c565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c4e57611c4e611c2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b87565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611cfb57611cfb611cbb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612d09565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611d88576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d9860408201602083016135a0565b611da56040830183613c46565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611dfc92509050613b86565b15905080611e525750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e3d91906143db565b9081526040519081900360200190205460ff16155b15611e8b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c07919061358d565b611e9b60408401602085016135a0565b67ffffffffffffffff8116600090815260036020526040902080548190611ec190613b86565b9050600003611f08576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6000611f176060870187613c46565b810190611f2491906135eb565b60095490915074010000000000000000000000000000000000000000900460ff16611f5c57611f5c611f578260016143ed565b61280d565b505050505050565b6001611f71600583612931565b14611fab576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c07565b611fb6816000610c17565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611ffe90613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90613b86565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b5050505050815260200160038201805461209090613b86565b80601f01602080910402602001604051908101604052809291908181526020018280546120bc90613b86565b80156121095780601f106120de57610100808354040283529160200191612109565b820191906000526020600020905b8154815290600101906020018083116120ec57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561218c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612137565b5050505081525050905061219f81612e0d565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906121f790613b86565b905060000361223e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061226e90613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461229a90613b86565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161234890613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461237490613b86565b80156123c15780601f10612396576101008083540402835291602001916123c1565b820191906000526020600020905b8154815290600101906020018083116123a457829003601f168201915b5050505050815250905060005b865181101561251e5761243e33308984815181106123ee576123ee613bd9565b6020026020010151602001518a858151811061240c5761240c613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e7f909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061246e5761246e613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146125165760025487516125169173ffffffffffffffffffffffffffffffffffffffff16908990849081106124c7576124c7613bd9565b6020026020010151602001518984815181106124e5576124e5613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b879092919063ffffffff16565b6001016123ce565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612578908b908690600401614400565b602060405180830381865afa158015612595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b991906144cd565b60085490915073ffffffffffffffffffffffffffffffffffffffff161580159061267257506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561264c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267091906144cd565b105b1561269c5760085461269c9073ffffffffffffffffffffffffffffffffffffffff16333084612e7f565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156126ce5760006126d0565b825b8a856040518463ffffffff1660e01b81526004016126ef929190614400565b60206040518083038185885af115801561270d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061273291906144cd565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161276591815260200190565b60405180910390a1505050509392505050565b61278061278c565b61278981612edd565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c07565b80600116600103612850576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612884565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161289991815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600854600080855260208501909352909350611518927401000000000000000000000000000000000000000090910467ffffffffffffffff169161292a565b60408051808201909152600080825260208201528152602001906001900390816129035790505b50836121ce565b600061293d8383612fd2565b9392505050565b804710156129ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c07565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a08576040519150601f19603f3d011682016040523d82523d6000602084013e612a0d565b606091505b5050905080611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261305c565b6000612b7f848484613168565b949350505050565b801580612c2757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2591906144cd565b155b612cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da491906144cd565b612dae91906143ed565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612e079085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af0565b50505050565b612e1561278c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e519084906004016136f0565b600060405180830381600087803b158015612e6b57600080fd5b505af115801561130d573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e079085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612af0565b3373ffffffffffffffffffffffffffffffffffffffff821603612f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c07565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612ff65750612ff68484613185565b61293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c07565b60006130be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131919092919063ffffffff16565b80519091501561151857808060200190518101906130dc91906144e6565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c07565b60008281526002840160205260408120829055612b7f84846131a0565b600061293d83836131ac565b6060612b7f84846000856131c4565b600061293d83836132dd565b6000818152600183016020526040812054151561293d565b606082471015613256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c07565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161327f91906143db565b60006040518083038185875af1925050503d80600081146132bc576040519150601f19603f3d011682016040523d82523d6000602084013e6132c1565b606091505b50915091506132d28783838761332c565b979650505050505050565b6000818152600183016020526040812054613324575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b2565b5060006108b2565b606083156133c25782516000036133bb5773ffffffffffffffffffffffffffffffffffffffff85163b6133bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c07565b5081612b7f565b612b7f83838151156133d75781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07919061358d565b50805461341790613b86565b6000825580601f10613427575050565b601f01602090049060005260206000209081019061278991905b808211156134555760008155600101613441565b5090565b67ffffffffffffffff8116811461278957600080fd5b60008060006040848603121561348457600080fd5b833561348f81613459565b9250602084013567ffffffffffffffff808211156134ac57600080fd5b818601915086601f8301126134c057600080fd5b8135818111156134cf57600080fd5b8760208285010111156134e157600080fd5b6020830194508093505050509250925092565b801515811461278957600080fd5b60006020828403121561351457600080fd5b813561293d816134f4565b60005b8381101561353a578181015183820152602001613522565b50506000910152565b6000815180845261355b81602086016020860161351f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061293d6020830184613543565b6000602082840312156135b257600080fd5b813561293d81613459565b6040815260006135d06040830185613543565b82810360208401526135e28185613543565b95945050505050565b6000602082840312156135fd57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461278957600080fd5b6000806040838503121561363957600080fd5b823561364481613604565b946020939093013593505050565b60008060006060848603121561366757600080fd5b833561367281613604565b9250602084013561368281613604565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136e5578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136a8565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261372a60c0840182613543565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137668383613543565b925060808601519150808584030160a0860152506135e28282613693565b6000806040838503121561379757600080fd5b8235915060208301356137a981613604565b809150509250929050565b60008083601f8401126137c657600080fd5b50813567ffffffffffffffff8111156137de57600080fd5b6020830191508360208260051b85010111156137f957600080fd5b9250929050565b6000806000806040858703121561381657600080fd5b843567ffffffffffffffff8082111561382e57600080fd5b61383a888389016137b4565b9096509450602087013591508082111561385357600080fd5b50613860878288016137b4565b95989497509550505050565b60006020828403121561387e57600080fd5b813567ffffffffffffffff81111561389557600080fd5b820160a0818503121561293d57600080fd5b6000602082840312156138b957600080fd5b813561293d81613604565b600080602083850312156138d757600080fd5b823567ffffffffffffffff8111156138ee57600080fd5b6138fa858286016137b4565b90969095509350505050565b6000806040838503121561391957600080fd5b823561392481613459565b915060208301356137a981613604565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561398657613986613934565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139d3576139d3613934565b604052919050565b600082601f8301126139ec57600080fd5b813567ffffffffffffffff811115613a0657613a06613934565b613a3760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161398c565b818152846020838601011115613a4c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a7e57600080fd5b8335613a8981613459565b925060208481013567ffffffffffffffff80821115613aa757600080fd5b818701915087601f830112613abb57600080fd5b813581811115613acd57613acd613934565b613adb848260051b0161398c565b81815260069190911b8301840190848101908a831115613afa57600080fd5b938501935b82851015613b46576040858c031215613b185760008081fd5b613b20613963565b8535613b2b81613604565b81528587013587820152825260409094019390850190613aff565b965050506040870135925080831115613b5e57600080fd5b5050613b6c868287016139db565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b9a57607f821691505b602082108103613bd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c3c57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c7b57600080fd5b83018035915067ffffffffffffffff821115613c9657600080fd5b6020019150368190038213156137f957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ce057600080fd5b830160208101925035905067ffffffffffffffff811115613d0057600080fd5b8036038213156137f957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136e5578135613d7b81613604565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d68565b602081528135602082015260006020830135613dc881613459565b67ffffffffffffffff8082166040850152613de66040860186613cab565b925060a06060860152613dfd60c086018483613d0f565b925050613e0d6060860186613cab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e43858385613d0f565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e7c57600080fd5b60209288019283019235915083821115613e9557600080fd5b8160061b3603831315613ea757600080fd5b8685030160a08701526132d2848284613d58565b601f821115611518576000816000526020600020601f850160051c81016020861015613ee45750805b601f850160051c820191505b81811015611f5c57828155600101613ef0565b67ffffffffffffffff831115613f1b57613f1b613934565b613f2f83613f298354613b86565b83613ebb565b6000601f841160018114613f815760008515613f4b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561130d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fd05786850135825560209485019460019092019101613fb0565b508682101561400b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561405781613604565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140bd576140bd613934565b80548382558084101561414a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140fe576140fe61401d565b808616861461410f5761410f61401d565b5060008360005260206000208360011b81018760011b820191505b8082101561414557828255828483015560028201915061412a565b505050505b5060008181526020812083915b85811015611f5c57614169838361404c565b6040929092019160029190910190600101614157565b8135815560018101602083013561419581613459565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141d56040860186613c46565b935091506141e7838360028701613f03565b6141f46060860186613c46565b93509150614206838360038701613f03565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261423d57600080fd5b91840191823591508082111561425257600080fd5b506020820191508060061b360382131561426b57600080fd5b612e078183600486016140a4565b815167ffffffffffffffff81111561429357614293613934565b6142a7816142a18454613b86565b84613ebb565b602080601f8311600181146142fa57600084156142c45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f5c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561434757888601518255948401946001909101908401614328565b508582101561438357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c3c57600080fd5b602081526000612b7f602083018486613d0f565b60008251613c3c81846020870161351f565b808201808211156108b2576108b261401d565b67ffffffffffffffff83168152604060208201526000825160a0604084015261442c60e0840182613543565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144688383613543565b925060408601519150808584030160808601526144858383613693565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144c38282613543565b9695505050505050565b6000602082840312156144df57600080fd5b5051919050565b6000602082840312156144f857600080fd5b815161293d816134f456fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -196,28 +196,6 @@ func (_PingPongDemo *PingPongDemoTransactorRaw) Transact(opts *bind.TransactOpts return _PingPongDemo.Contract.contract.Transact(opts, method, params...) } -func (_PingPongDemo *PingPongDemoCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -func (_PingPongDemo *PingPongDemoSession) ACKMESSAGEHEADER() (string, error) { - return _PingPongDemo.Contract.ACKMESSAGEHEADER(&_PingPongDemo.CallOpts) -} - -func (_PingPongDemo *PingPongDemoCallerSession) ACKMESSAGEHEADER() (string, error) { - return _PingPongDemo.Contract.ACKMESSAGEHEADER(&_PingPongDemo.CallOpts) -} - func (_PingPongDemo *PingPongDemoCaller) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "getCounterpartAddress") @@ -446,28 +424,6 @@ func (_PingPongDemo *PingPongDemoCallerSession) SFeeToken() (common.Address, err 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) SMessageStatus(messageId [32]byte) (uint8, error) { - return _PingPongDemo.Contract.SMessageStatus(&_PingPongDemo.CallOpts, messageId) -} - -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) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "typeAndVersion") @@ -1451,41 +1407,23 @@ func (it *PingPongDemoFeeTokenUpdatedIterator) Close() error { } type PingPongDemoFeeTokenUpdated struct { - OldToken common.Address - NewToken common.Address - Raw types.Log + OldFeeToken common.Address + NewFeeToken common.Address + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenUpdatedIterator, error) { - - var oldTokenRule []interface{} - for _, oldTokenItem := range oldToken { - oldTokenRule = append(oldTokenRule, oldTokenItem) - } - var newTokenRule []interface{} - for _, newTokenItem := range newToken { - newTokenRule = append(newTokenRule, newTokenItem) - } +func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts) (*PingPongDemoFeeTokenUpdatedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "FeeTokenUpdated") if err != nil { return nil, err } return &PingPongDemoFeeTokenUpdatedIterator{contract: _PingPongDemo.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated, 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) - } +func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "FeeTokenUpdated") if err != nil { return nil, err } @@ -1654,240 +1592,6 @@ func (_PingPongDemo *PingPongDemoFilterer) ParseMessageAbandoned(log types.Log) return event, nil } -type PingPongDemoMessageAckReceivedIterator struct { - Event *PingPongDemoMessageAckReceived - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *PingPongDemoMessageAckReceivedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(PingPongDemoMessageAckReceived) - 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(PingPongDemoMessageAckReceived) - 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 *PingPongDemoMessageAckReceivedIterator) Error() error { - return it.fail -} - -func (it *PingPongDemoMessageAckReceivedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type PingPongDemoMessageAckReceived struct { - MessageId [32]byte - Raw types.Log -} - -func (_PingPongDemo *PingPongDemoFilterer) FilterMessageAckReceived(opts *bind.FilterOpts) (*PingPongDemoMessageAckReceivedIterator, error) { - - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageAckReceived") - if err != nil { - return nil, err - } - return &PingPongDemoMessageAckReceivedIterator{contract: _PingPongDemo.contract, event: "MessageAckReceived", logs: logs, sub: sub}, nil -} - -func (_PingPongDemo *PingPongDemoFilterer) WatchMessageAckReceived(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckReceived) (event.Subscription, error) { - - logs, sub, err := _PingPongDemo.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(PingPongDemoMessageAckReceived) - if err := _PingPongDemo.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 (_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 PingPongDemoMessageAckSentIterator struct { - Event *PingPongDemoMessageAckSent - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *PingPongDemoMessageAckSentIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(PingPongDemoMessageAckSent) - 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(PingPongDemoMessageAckSent) - 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 *PingPongDemoMessageAckSentIterator) Error() error { - return it.fail -} - -func (it *PingPongDemoMessageAckSentIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type PingPongDemoMessageAckSent struct { - IncomingMessageId [32]byte - Raw types.Log -} - -func (_PingPongDemo *PingPongDemoFilterer) FilterMessageAckSent(opts *bind.FilterOpts) (*PingPongDemoMessageAckSentIterator, error) { - - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageAckSent") - if err != nil { - return nil, err - } - return &PingPongDemoMessageAckSentIterator{contract: _PingPongDemo.contract, event: "MessageAckSent", logs: logs, sub: sub}, nil -} - -func (_PingPongDemo *PingPongDemoFilterer) WatchMessageAckSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageAckSent) (event.Subscription, error) { - - logs, sub, err := _PingPongDemo.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(PingPongDemoMessageAckSent) - if err := _PingPongDemo.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 (_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 PingPongDemoMessageFailedIterator struct { Event *PingPongDemoMessageFailed @@ -2204,41 +1908,22 @@ func (it *PingPongDemoMessageSentIterator) Close() error { } type PingPongDemoMessageSent struct { - IncomingMessageId [32]byte - ACKMessageId [32]byte - Raw types.Log + MessageId [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) - } +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageSent(opts *bind.FilterOpts) (*PingPongDemoMessageSentIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageSent") 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) { +func (_PingPongDemo *PingPongDemoFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSent) (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) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "MessageSent") if err != nil { return nil, err } @@ -3070,10 +2755,6 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, return _PingPongDemo.ParseFeeTokenUpdated(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: - return _PingPongDemo.ParseMessageAckSent(log) case _PingPongDemo.abi.Events["MessageFailed"].ID: return _PingPongDemo.ParseMessageFailed(log) case _PingPongDemo.abi.Events["MessageRecovered"].ID: @@ -3126,14 +2807,6 @@ func (PingPongDemoMessageAbandoned) Topic() common.Hash { return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") } -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") } @@ -3143,7 +2816,7 @@ func (PingPongDemoMessageRecovered) Topic() common.Hash { } func (PingPongDemoMessageSent) Topic() common.Hash { - return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") + return common.HexToHash("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") } func (PingPongDemoMessageSucceeded) Topic() common.Hash { @@ -3175,8 +2848,6 @@ func (_PingPongDemo *PingPongDemo) Address() common.Address { } type PingPongDemoInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) - GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) @@ -3199,8 +2870,6 @@ type PingPongDemoInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) - SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -3271,9 +2940,9 @@ type PingPongDemoInterface interface { ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, error) - FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*PingPongDemoFeeTokenUpdatedIterator, error) + FilterFeeTokenUpdated(opts *bind.FilterOpts) (*PingPongDemoFeeTokenUpdatedIterator, error) - WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated) (event.Subscription, error) ParseFeeTokenUpdated(log types.Log) (*PingPongDemoFeeTokenUpdated, error) @@ -3283,18 +2952,6 @@ type PingPongDemoInterface interface { ParseMessageAbandoned(log types.Log) (*PingPongDemoMessageAbandoned, 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) @@ -3307,9 +2964,9 @@ type PingPongDemoInterface interface { ParseMessageRecovered(log types.Log) (*PingPongDemoMessageRecovered, error) - FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*PingPongDemoMessageSentIterator, error) + FilterMessageSent(opts *bind.FilterOpts) (*PingPongDemoMessageSentIterator, error) - WatchMessageSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSent) (event.Subscription, error) ParseMessageSent(log types.Log) (*PingPongDemoMessageSent, 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 22998c3262..b1689599be 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 @@ -56,8 +56,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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620051393803806200513983398101604081905262000034916200059b565b82828181818181803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000177565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013f576200013f6001600160a01b0382168360001962000222565b5050505050508060026200015491906200060a565b600a601d6101000a81548160ff021916908360ff1602179055505050506200070a565b336001600160a01b03821603620001d15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029a919062000630565b620002a691906200064a565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000302918691906200030816565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000357906001600160a01b038516908490620003de565b805190915015620003d9578080602001905181019062000378919062000666565b620003d95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b505050565b6060620003ef8484600085620003f7565b949350505050565b6060824710156200045a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004789190620006b7565b60006040518083038185875af1925050503d8060008114620004b7576040519150601f19603f3d011682016040523d82523d6000602084013e620004bc565b606091505b509092509050620004d087838387620004db565b979650505050505050565b606083156200054f57825160000362000547576001600160a01b0385163b620005475760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b5081620003ef565b620003ef8383815115620005665781518083602001fd5b8060405162461bcd60e51b81526004016200008a9190620006d5565b6001600160a01b03811681146200059857600080fd5b50565b600080600060608486031215620005b157600080fd5b8351620005be8162000582565b6020850151909350620005d18162000582565b604085015190925060ff81168114620005e957600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60ff8181168382160290811690818114620006295762000629620005f4565b5092915050565b6000602082840312156200064357600080fd5b5051919050565b80820180821115620006605762000660620005f4565b92915050565b6000602082840312156200067957600080fd5b815180151581146200068a57600080fd5b9392505050565b60005b83811015620006ae57818101518382015260200162000694565b50506000910152565b60008251620006cb81846020870162000691565b9190910192915050565b6020815260008251806020840152620006f681604085016020870162000691565b601f01601f19169190910160400192915050565b614a1f806200071a6000396000f3fe60806040526004361061021d5760003560e01c80638da5cb5b1161011d578063c851cc32116100b0578063e6c725f51161007f578063ef686d8e11610064578063ef686d8e1461073b578063f2fde38b1461075b578063ff2deec31461077b57600080fd5b8063e6c725f5146106e2578063e89b44851461072857600080fd5b8063c851cc3214610662578063c89245d514610682578063cf6730f8146106a2578063e4ca8754146106c257600080fd5b8063b0f479a1116100ec578063b0f479a1146105b6578063b187bd26146105e1578063b5a1101114610619578063bee518a41461063957600080fd5b80638da5cb5b1461052b5780638f491cba146105565780639d2aede5146105765780639fe74e261461059657600080fd5b80635075a9d4116101b05780636d62d6331161017f57806379ba50971161016457806379ba5097146104d65780638462a2b9146104eb57806385572ffb1461050b57600080fd5b80636d62d6331461046d5780636fef519e1461048d57600080fd5b80635075a9d4146103d2578063536c6bfa146104005780635e35359e146104205780636939cd971461044057600080fd5b80631892b906116101ec5780631892b906146103175780632874d8bf146103375780632b6e5d631461034c57806335f170ef146103a457600080fd5b806305bfe982146102295780630e958d6b1461026f57806316c38b3c1461029f578063181f5a77146102c157600080fd5b3661022457005b600080fd5b34801561023557600080fd5b506102596102443660046138ac565b60096020526000908152604090205460ff1681565b60405161026691906138c5565b60405180910390f35b34801561027b57600080fd5b5061028f61028a36600461391c565b6107a8565b6040519015158152602001610266565b3480156102ab57600080fd5b506102bf6102ba3660046139af565b6107f3565b005b3480156102cd57600080fd5b5061030a6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b6040516102669190613a3a565b34801561032357600080fd5b506102bf610332366004613a4d565b61084d565b34801561034357600080fd5b506102bf610890565b34801561035857600080fd5b50600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610266565b3480156103b057600080fd5b506103c46103bf366004613a4d565b6108cc565b604051610266929190613a6a565b3480156103de57600080fd5b506103f26103ed3660046138ac565b6109f8565b604051908152602001610266565b34801561040c57600080fd5b506102bf61041b366004613aba565b610a0b565b34801561042c57600080fd5b506102bf61043b366004613ae6565b610a6f565b34801561044c57600080fd5b5061046061045b3660046138ac565b610b04565b6040516102669190613b84565b34801561047957600080fd5b506102bf610488366004613c18565b610d0f565b34801561049957600080fd5b5061030a6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b3480156104e257600080fd5b506102bf611029565b3480156104f757600080fd5b506102bf610506366004613c94565b611126565b34801561051757600080fd5b506102bf610526366004613d00565b611467565b34801561053757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661037f565b34801561056257600080fd5b506102bf6105713660046138ac565b611670565b34801561058257600080fd5b506102bf610591366004613d3b565b61184c565b3480156105a257600080fd5b506102bf6105b1366004613d58565b611907565b3480156105c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661037f565b3480156105ed57600080fd5b50600a547c0100000000000000000000000000000000000000000000000000000000900460ff1661028f565b34801561062557600080fd5b506102bf610634366004613d9a565b611c98565b34801561064557600080fd5b50600a5460405167ffffffffffffffff9091168152602001610266565b34801561066e57600080fd5b506102bf61067d366004613d3b565b611e08565b34801561068e57600080fd5b506102bf61069d366004613d3b565b611ed4565b3480156106ae57600080fd5b506102bf6106bd366004613d00565b612048565b3480156106ce57600080fd5b506102bf6106dd3660046138ac565b612265565b3480156106ee57600080fd5b50600a547d010000000000000000000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610266565b6103f2610736366004613efd565b6124cf565b34801561074757600080fd5b506102bf61075636600461400a565b612a05565b34801561076757600080fd5b506102bf610776366004613d3b565b612a96565b34801561078757600080fd5b5060085461037f9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107d7908590859061402d565b9081526040519081900360200190205460ff1690509392505050565b6107fb612aa7565b600a80549115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b610855612aa7565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b610898612aa7565b600a80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556108ca6001612b28565b565b6003602052600090815260409020805481906108e79061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546109139061403d565b80156109605780601f1061093557610100808354040283529160200191610960565b820191906000526020600020905b81548152906001019060200180831161094357829003601f168201915b5050505050908060010180546109759061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546109a19061403d565b80156109ee5780601f106109c3576101008083540402835291602001916109ee565b820191906000526020600020905b8154815290600101906020018083116109d157829003601f168201915b5050505050905082565b6000610a05600583612d84565b92915050565b610a13612aa7565b610a1d8282612d97565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610a77612aa7565b610a9873ffffffffffffffffffffffffffffffffffffffff84168383612ef1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610af791815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610b739061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f9061403d565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b50505050508152602001600382018054610c059061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c319061403d565b8015610c7e5780601f10610c5357610100808354040283529160200191610c7e565b820191906000526020600020905b815481529060010190602001808311610c6157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610d015760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610cac565b505050915250909392505050565b610d17612aa7565b6001610d24600584612d84565b14610d63576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610d738260025b60059190612fc5565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610dbb9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610de79061403d565b8015610e345780601f10610e0957610100808354040283529160200191610e34565b820191906000526020600020905b815481529060010190602001808311610e1757829003601f168201915b50505050508152602001600382018054610e4d9061403d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e799061403d565b8015610ec65780601f10610e9b57610100808354040283529160200191610ec6565b820191906000526020600020905b815481529060010190602001808311610ea957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610f495760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ef4565b5050505081525050905060005b816080015151811015610fd857610fd08383608001518381518110610f7d57610f7d614090565b60200260200101516020015184608001518481518110610f9f57610f9f614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ef19092919063ffffffff16565b600101610f56565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610d5a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61112e612aa7565b60005b818110156112c1576003600084848481811061114f5761114f614090565b905060200281019061116191906140bf565b61116f906020810190613a4d565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106111a6576111a6614090565b90506020028101906111b891906140bf565b6111c69060208101906140fd565b6040516111d492919061402d565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061121b5761121b614090565b905060200281019061122d91906140bf565b61123b9060208101906140fd565b60405161124992919061402d565b604051809103902083838381811061126357611263614090565b905060200281019061127591906140bf565b611283906020810190613a4d565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611131565b5060005b83811015611460576001600360008787858181106112e5576112e5614090565b90506020028101906112f791906140bf565b611305906020810190613a4d565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061133c5761133c614090565b905060200281019061134e91906140bf565b61135c9060208101906140fd565b60405161136a92919061402d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106113ba576113ba614090565b90506020028101906113cc91906140bf565b6113da9060208101906140fd565b6040516113e892919061402d565b604051809103902085858381811061140257611402614090565b905060200281019061141491906140bf565b611422906020810190613a4d565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016112c5565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146114ba576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610d5a565b6114ca6040820160208301613a4d565b67ffffffffffffffff81166000908152600360205260409020805481906114f09061403d565b9050600003611537576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d5a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611573908690600401614264565b600060405180830381600087803b15801561158d57600080fd5b505af192505050801561159e575060015b61163e573d8080156115cc576040519150601f19603f3d011682016040523d82523d6000602084013e6115d1565b606091505b506115de84356001610d6a565b508335600090815260046020526040902084906115fb8282614636565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611630908490613a3a565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b600a547d010000000000000000000000000000000000000000000000000000000000900460ff1615806116c85750600a547d010000000000000000000000000000000000000000000000000000000000900460ff1681105b156116d05750565b600a54600190611704907d010000000000000000000000000000000000000000000000000000000000900460ff1683614730565b116118495760025473ffffffffffffffffffffffffffffffffffffffff16600a546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c0919061476b565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561180757600080fd5b505af115801561181b573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b611854612aa7565b600a80547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff84169081029190911790915560408051602081019290925201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152600a5467ffffffffffffffff166000908152600360205220906119039082614788565b5050565b61190f612aa7565b60005b8181101561166b5782828281811061192c5761192c614090565b905060200281019061193e91906148a2565b61194f9060408101906020016139af565b611a1b576003600084848481811061196957611969614090565b905060200281019061197b91906148a2565b611989906020810190613a4d565b67ffffffffffffffff168152602081019190915260400160009081206119ae9161385e565b8282828181106119c0576119c0614090565b90506020028101906119d291906148a2565b6119e0906020810190613a4d565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611c90565b828282818110611a2d57611a2d614090565b9050602002810190611a3f91906148a2565b611a4d9060408101906140fd565b9050600003611a88576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611aa057611aa0614090565b9050602002810190611ab291906148a2565b611ac0906020810190613a4d565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611af657611af6614090565b9050602002810190611b0891906148a2565b611b169060408101906140fd565b8291611b239190836143ba565b50838383818110611b3657611b36614090565b9050602002810190611b4891906148a2565b611b569060608101906140fd565b159050611ba157838383818110611b6f57611b6f614090565b9050602002810190611b8191906148a2565b611b8f9060608101906140fd565b6001830191611b9f9190836143ba565b505b838383818110611bb357611bb3614090565b9050602002810190611bc591906148a2565b611bd39060408101906140fd565b604051611be192919061402d565b6040518091039020848484818110611bfb57611bfb614090565b9050602002810190611c0d91906148a2565b611c1b906020810190613a4d565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611c5857611c58614090565b9050602002810190611c6a91906148a2565b611c789060608101906140fd565b604051611c869291906148d6565b60405180910390a3505b600101611912565b611ca0612aa7565b600a805467ffffffffffffffff84167fffffffff0000000000000000000000000000000000000000000000000000000090911681176801000000000000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179092556000908152600360209081526040918290208251918201939093526001926002019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611d5b916148ea565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061166b9082614788565b611e10612aa7565b73ffffffffffffffffffffffffffffffffffffffff8116611e5d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611edc612aa7565b60085473ffffffffffffffffffffffffffffffffffffffff1615611f3d57611f3d611f1c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612fda565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611fea57611fea611faa60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61315c565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014612081576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120916040820160208301613a4d565b61209e60408301836140fd565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506120f59250905061403d565b1590508061214b5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161213691906148ea565b9081526040519081900360200190205460ff16155b1561218457806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610d5a9190613a3a565b6121946040840160208501613a4d565b67ffffffffffffffff81166000908152600360205260409020805481906121ba9061403d565b9050600003612201576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d5a565b600061221060608701876140fd565b81019061221d91906138ac565b600a549091507c0100000000000000000000000000000000000000000000000000000000900460ff1661225d5761225d6122588260016148fc565b612b28565b505050505050565b6001612272600583612d84565b146122ac576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610d5a565b6122b7816000610d6a565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916122ff9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461232b9061403d565b80156123785780601f1061234d57610100808354040283529160200191612378565b820191906000526020600020905b81548152906001019060200180831161235b57829003601f168201915b505050505081526020016003820180546123919061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd9061403d565b801561240a5780601f106123df5761010080835404028352916020019161240a565b820191906000526020600020905b8154815290600101906020018083116123ed57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561248d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612438565b505050508152505090506124a081613260565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906124f89061403d565b905060000361253f576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d5a565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061256f9061403d565b80601f016020809104026020016040519081016040528092919081815260200182805461259b9061403d565b80156125e85780601f106125bd576101008083540402835291602001916125e8565b820191906000526020600020905b8154815290600101906020018083116125cb57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916126499061403d565b80601f01602080910402602001604051908101604052809291908181526020018280546126759061403d565b80156126c25780601f10612697576101008083540402835291602001916126c2565b820191906000526020600020905b8154815290600101906020018083116126a557829003601f168201915b5050505050815250905060005b865181101561281f5761273f33308984815181106126ef576126ef614090565b6020026020010151602001518a858151811061270d5761270d614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132d2909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061276f5761276f614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146128175760025487516128179173ffffffffffffffffffffffffffffffffffffffff16908990849081106127c8576127c8614090565b6020026020010151602001518984815181106127e6576127e6614090565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612fda9092919063ffffffff16565b6001016126cf565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612879908b90869060040161490f565b602060405180830381865afa158015612896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ba91906149dc565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615612900576008546129009073ffffffffffffffffffffffffffffffffffffffff163330846132d2565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612932576000612934565b825b8a856040518463ffffffff1660e01b815260040161295392919061490f565b60206040518083038185885af1158015612971573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061299691906149dc565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612a0d612aa7565b600a80547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a9e612aa7565b61184981613330565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610d5a565b80600116600103612b6b576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b9f565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612ba881611670565b6040805160a08101909152600a5468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612c0c91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612c8657816020015b6040805180820190915260008082526020820152815260200190600190039081612c5f5790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612cdd60025473ffffffffffffffffffffffffffffffffffffffff1690565b600a546040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216916396f4e9f991612d419167ffffffffffffffff90911690859060040161490f565b6020604051808303816000875af1158015612d60573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906149dc565b6000612d908383613425565b9392505050565b80471015612e01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d5a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e5b576040519150601f19603f3d011682016040523d82523d6000602084013e612e60565b606091505b505090508061166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d5a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261166b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526134af565b6000612fd28484846135bb565b949350505050565b80158061307a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307891906149dc565b155b613106576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610d5a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261166b9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f43565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156131d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f791906149dc565b61320191906148fc565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061325a9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f43565b50505050565b613268612aa7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906132a4908490600401613b84565b600060405180830381600087803b1580156132be57600080fd5b505af1158015611460573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261325a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612f43565b3373ffffffffffffffffffffffffffffffffffffffff8216036133af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610d5a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580613449575061344984846135d8565b612d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610d5a565b6000613511826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135e49092919063ffffffff16565b80519091501561166b578080602001905181019061352f91906149f5565b61166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d5a565b60008281526002840160205260408120829055612fd284846135f3565b6000612d9083836135ff565b6060612fd28484600085613617565b6000612d908383613730565b60008181526001830160205260408120541515612d90565b6060824710156136a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d5a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136d291906148ea565b60006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091506137258783838761377f565b979650505050505050565b600081815260018301602052604081205461377757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a05565b506000610a05565b6060831561381557825160000361380e5773ffffffffffffffffffffffffffffffffffffffff85163b61380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d5a565b5081612fd2565b612fd2838381511561382a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a9190613a3a565b50805461386a9061403d565b6000825580601f1061387a575050565b601f01602090049060005260206000209081019061184991905b808211156138a85760008155600101613894565b5090565b6000602082840312156138be57600080fd5b5035919050565b6020810160038310613900577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461184957600080fd5b60008060006040848603121561393157600080fd5b833561393c81613906565b9250602084013567ffffffffffffffff8082111561395957600080fd5b818601915086601f83011261396d57600080fd5b81358181111561397c57600080fd5b87602082850101111561398e57600080fd5b6020830194508093505050509250925092565b801515811461184957600080fd5b6000602082840312156139c157600080fd5b8135612d90816139a1565b60005b838110156139e75781810151838201526020016139cf565b50506000910152565b60008151808452613a088160208601602086016139cc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d9060208301846139f0565b600060208284031215613a5f57600080fd5b8135612d9081613906565b604081526000613a7d60408301856139f0565b8281036020840152613a8f81856139f0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461184957600080fd5b60008060408385031215613acd57600080fd5b8235613ad881613a98565b946020939093013593505050565b600080600060608486031215613afb57600080fd5b8335613b0681613a98565b92506020840135613b1681613a98565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b79578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613b3c565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613bbe60c08401826139f0565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613bfa83836139f0565b925060808601519150808584030160a086015250613a8f8282613b27565b60008060408385031215613c2b57600080fd5b823591506020830135613c3d81613a98565b809150509250929050565b60008083601f840112613c5a57600080fd5b50813567ffffffffffffffff811115613c7257600080fd5b6020830191508360208260051b8501011115613c8d57600080fd5b9250929050565b60008060008060408587031215613caa57600080fd5b843567ffffffffffffffff80821115613cc257600080fd5b613cce88838901613c48565b90965094506020870135915080821115613ce757600080fd5b50613cf487828801613c48565b95989497509550505050565b600060208284031215613d1257600080fd5b813567ffffffffffffffff811115613d2957600080fd5b820160a08185031215612d9057600080fd5b600060208284031215613d4d57600080fd5b8135612d9081613a98565b60008060208385031215613d6b57600080fd5b823567ffffffffffffffff811115613d8257600080fd5b613d8e85828601613c48565b90969095509350505050565b60008060408385031215613dad57600080fd5b8235613db881613906565b91506020830135613c3d81613a98565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613e1a57613e1a613dc8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e6757613e67613dc8565b604052919050565b600082601f830112613e8057600080fd5b813567ffffffffffffffff811115613e9a57613e9a613dc8565b613ecb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613e20565b818152846020838601011115613ee057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613f1257600080fd5b8335613f1d81613906565b925060208481013567ffffffffffffffff80821115613f3b57600080fd5b818701915087601f830112613f4f57600080fd5b813581811115613f6157613f61613dc8565b613f6f848260051b01613e20565b81815260069190911b8301840190848101908a831115613f8e57600080fd5b938501935b82851015613fda576040858c031215613fac5760008081fd5b613fb4613df7565b8535613fbf81613a98565b81528587013587820152825260409094019390850190613f93565b965050506040870135925080831115613ff257600080fd5b505061400086828701613e6f565b9150509250925092565b60006020828403121561401c57600080fd5b813560ff81168114612d9057600080fd5b8183823760009101908152919050565b600181811c9082168061405157607f821691505b60208210810361408a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126140f357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261413257600080fd5b83018035915067ffffffffffffffff82111561414d57600080fd5b602001915036819003821315613c8d57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261419757600080fd5b830160208101925035905067ffffffffffffffff8111156141b757600080fd5b803603821315613c8d57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b7957813561423281613a98565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161421f565b60208152813560208201526000602083013561427f81613906565b67ffffffffffffffff808216604085015261429d6040860186614162565b925060a060608601526142b460c0860184836141c6565b9250506142c46060860186614162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526142fa8583856141c6565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261433357600080fd5b6020928801928301923591508382111561434c57600080fd5b8160061b360383131561435e57600080fd5b8685030160a087015261372584828461420f565b601f82111561166b576000816000526020600020601f850160051c8101602086101561439b5750805b601f850160051c820191505b8181101561225d578281556001016143a7565b67ffffffffffffffff8311156143d2576143d2613dc8565b6143e6836143e0835461403d565b83614372565b6000601f84116001811461443857600085156144025750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611460565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156144875786850135825560209485019460019092019101614467565b50868210156144c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561450e81613a98565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561457457614574613dc8565b8054838255808410156146015760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146145b5576145b56144d4565b80861686146145c6576145c66144d4565b5060008360005260206000208360011b81018760011b820191505b808210156145fc5782825582848301556002820191506145e1565b505050505b5060008181526020812083915b8581101561225d576146208383614503565b604092909201916002919091019060010161460e565b8135815560018101602083013561464c81613906565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561468c60408601866140fd565b9350915061469e8383600287016143ba565b6146ab60608601866140fd565b935091506146bd8383600387016143ba565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126146f457600080fd5b91840191823591508082111561470957600080fd5b506020820191508060061b360382131561472257600080fd5b61325a81836004860161455b565b600082614766577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561477d57600080fd5b8151612d9081613a98565b815167ffffffffffffffff8111156147a2576147a2613dc8565b6147b6816147b0845461403d565b84614372565b602080601f83116001811461480957600084156147d35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561225d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561485657888601518255948401946001909101908401614837565b508582101561489257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126140f357600080fd5b602081526000612fd26020830184866141c6565b600082516140f38184602087016139cc565b80820180821115610a0557610a056144d4565b67ffffffffffffffff83168152604060208201526000825160a0604084015261493b60e08401826139f0565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261497783836139f0565b925060408601519150808584030160808601526149948383613b27565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149d282826139f0565b9695505050505050565b6000602082840312156149ee57600080fd5b5051919050565b600060208284031215614a0757600080fd5b8151612d90816139a156fea164736f6c6343000818000a", + 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620050f1380380620050f18339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600960156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b6149ad80620007446000396000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e89b448511610064578063e89b44851461066e578063ef686d8e14610681578063f2fde38b146106a1578063ff2deec3146106c157600080fd5b8063c89245d5146105d0578063cf6730f8146105f0578063e4ca875414610610578063e6c725f51461063057600080fd5b8063b187bd26116100d1578063b187bd2614610515578063b5a1101114610545578063bee518a414610565578063c851cc32146105b057600080fd5b80638f491cba1461048a5780639d2aede5146104aa5780639fe74e26146104ca578063b0f479a1146104ea57600080fd5b8063536c6bfa1161017a57806379ba50971161014957806379ba50971461040a5780638462a2b91461041f57806385572ffb1461043f5780638da5cb5b1461045f57600080fd5b8063536c6bfa1461037d5780635e35359e1461039d5780636939cd97146103bd5780636d62d633146103ea57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635075a9d41461034f57600080fd5b80630e958d6b146101f357806316c38b3c14610228578063181f5a771461024a5780631892b906146102a057600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613891565b6106ee565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610248610243366004613924565b610739565b005b34801561025657600080fd5b506102936040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161021f91906139af565b3480156102ac57600080fd5b506102486102bb3660046139c2565b61078b565b3480156102cc57600080fd5b506102486107e6565b3480156102e157600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c3660046139c2565b610822565b60405161021f9291906139df565b34801561035b57600080fd5b5061036f61036a366004613a0d565b61094e565b60405190815260200161021f565b34801561038957600080fd5b50610248610398366004613a48565b610961565b3480156103a957600080fd5b506102486103b8366004613a74565b6109c5565b3480156103c957600080fd5b506103dd6103d8366004613a0d565b610a5a565b60405161021f9190613b12565b3480156103f657600080fd5b50610248610405366004613ba6565b610c65565b34801561041657600080fd5b50610248610f7f565b34801561042b57600080fd5b5061024861043a366004613c22565b61107c565b34801561044b57600080fd5b5061024861045a366004613c8e565b6113bd565b34801561046b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049657600080fd5b506102486104a5366004613a0d565b6115c6565b3480156104b657600080fd5b506102486104c5366004613cc9565b6117a1565b3480156104d657600080fd5b506102486104e5366004613ce6565b611866565b3480156104f657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561052157600080fd5b5060095474010000000000000000000000000000000000000000900460ff16610213565b34801561055157600080fd5b50610248610560366004613d28565b611bf7565b34801561057157600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105bc57600080fd5b506102486105cb366004613cc9565b611d9d565b3480156105dc57600080fd5b506102486105eb366004613cc9565b611e69565b3480156105fc57600080fd5b5061024861060b366004613c8e565b611fd3565b34801561061c57600080fd5b5061024861062b366004613a0d565b6121e8565b34801561063c57600080fd5b506009547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b61036f61067c366004613e8b565b612452565b34801561068d57600080fd5b5061024861069c366004613f98565b6129fc565b3480156106ad57600080fd5b506102486106bc366004613cc9565b612a85565b3480156106cd57600080fd5b506008546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061071d9085908590613fbb565b9081526040519081900360200190205460ff1690509392505050565b610741612a96565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610793612a96565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107ee612a96565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556108206001612b17565b565b60036020526000908152604090208054819061083d90613fcb565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613fcb565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050908060010180546108cb90613fcb565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613fcb565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905082565b600061095b600583612d53565b92915050565b610969612a96565b6109738282612d66565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109cd612a96565b6109ee73ffffffffffffffffffffffffffffffffffffffff84168383612ec0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a4d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ac990613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610af590613fcb565b8015610b425780601f10610b1757610100808354040283529160200191610b42565b820191906000526020600020905b815481529060010190602001808311610b2557829003601f168201915b50505050508152602001600382018054610b5b90613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790613fcb565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c02565b505050915250909392505050565b610c6d612a96565b6001610c7a600584612d53565b14610cb9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610cc98260025b60059190612f94565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610d1190613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90613fcb565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050508152602001600382018054610da390613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613fcb565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e9f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e4a565b5050505081525050905060005b816080015151811015610f2e57610f268383608001518381518110610ed357610ed361401e565b60200260200101516020015184608001518481518110610ef557610ef561401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ec09092919063ffffffff16565b600101610eac565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610cb0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611084612a96565b60005b8181101561121757600360008484848181106110a5576110a561401e565b90506020028101906110b7919061404d565b6110c59060208101906139c2565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110fc576110fc61401e565b905060200281019061110e919061404d565b61111c90602081019061408b565b60405161112a929190613fbb565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106111715761117161401e565b9050602002810190611183919061404d565b61119190602081019061408b565b60405161119f929190613fbb565b60405180910390208383838181106111b9576111b961401e565b90506020028101906111cb919061404d565b6111d99060208101906139c2565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611087565b5060005b838110156113b65760016003600087878581811061123b5761123b61401e565b905060200281019061124d919061404d565b61125b9060208101906139c2565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106112925761129261401e565b90506020028101906112a4919061404d565b6112b290602081019061408b565b6040516112c0929190613fbb565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106113105761131061401e565b9050602002810190611322919061404d565b61133090602081019061408b565b60405161133e929190613fbb565b60405180910390208585838181106113585761135861401e565b905060200281019061136a919061404d565b6113789060208101906139c2565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161121b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611410576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610cb0565b61142060408201602083016139c2565b67ffffffffffffffff811660009081526003602052604090208054819061144690613fcb565b905060000361148d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114c99086906004016141f2565b600060405180830381600087803b1580156114e357600080fd5b505af19250505080156114f4575060015b611594573d808015611522576040519150601f19603f3d011682016040523d82523d6000602084013e611527565b606091505b5061153484356001610cc0565b5083356000908152600460205260409020849061155182826145c4565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906115869084906139af565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6009547501000000000000000000000000000000000000000000900460ff16158061160e57506009547501000000000000000000000000000000000000000000900460ff1681105b156116165750565b600954600190611642907501000000000000000000000000000000000000000000900460ff16836146be565b1161179e5760025473ffffffffffffffffffffffffffffffffffffffff166008546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171591906146f9565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175c57600080fd5b505af1158015611770573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6117a9612a96565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906118629082614716565b5050565b61186e612a96565b60005b818110156115c15782828281811061188b5761188b61401e565b905060200281019061189d9190614830565b6118ae906040810190602001613924565b61197a57600360008484848181106118c8576118c861401e565b90506020028101906118da9190614830565b6118e89060208101906139c2565b67ffffffffffffffff1681526020810191909152604001600090812061190d9161382d565b82828281811061191f5761191f61401e565b90506020028101906119319190614830565b61193f9060208101906139c2565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611bef565b82828281811061198c5761198c61401e565b905060200281019061199e9190614830565b6119ac90604081019061408b565b90506000036119e7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106119ff576119ff61401e565b9050602002810190611a119190614830565b611a1f9060208101906139c2565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611a5557611a5561401e565b9050602002810190611a679190614830565b611a7590604081019061408b565b8291611a82919083614348565b50838383818110611a9557611a9561401e565b9050602002810190611aa79190614830565b611ab590606081019061408b565b159050611b0057838383818110611ace57611ace61401e565b9050602002810190611ae09190614830565b611aee90606081019061408b565b6001830191611afe919083614348565b505b838383818110611b1257611b1261401e565b9050602002810190611b249190614830565b611b3290604081019061408b565b604051611b40929190613fbb565b6040518091039020848484818110611b5a57611b5a61401e565b9050602002810190611b6c9190614830565b611b7a9060208101906139c2565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611bb757611bb761401e565b9050602002810190611bc99190614830565b611bd790606081019061408b565b604051611be5929190614864565b60405180910390a3505b600101611871565b611bff612a96565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611cf091614878565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115c19082614716565b611da5612a96565b73ffffffffffffffffffffffffffffffffffffffff8116611df2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611e71612a96565b60085473ffffffffffffffffffffffffffffffffffffffff1615611ed257611ed2611eb160025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612fa9565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611f7f57611f7f611f3f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61312b565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461200c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61201c60408201602083016139c2565b612029604083018361408b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061208092509050613fcb565b159050806120d65750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516120c19190614878565b9081526040519081900360200190205460ff16155b1561210f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610cb091906139af565b61211f60408401602085016139c2565b67ffffffffffffffff811660009081526003602052604090208054819061214590613fcb565b905060000361218c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b600061219b606087018761408b565b8101906121a89190613a0d565b60095490915074010000000000000000000000000000000000000000900460ff166121e0576121e06121db82600161488a565b612b17565b505050505050565b60016121f5600583612d53565b1461222f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610cb0565b61223a816000610cc0565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161228290613fcb565b80601f01602080910402602001604051908101604052809291908181526020018280546122ae90613fcb565b80156122fb5780601f106122d0576101008083540402835291602001916122fb565b820191906000526020600020905b8154815290600101906020018083116122de57829003601f168201915b5050505050815260200160038201805461231490613fcb565b80601f016020809104026020016040519081016040528092919081815260200182805461234090613fcb565b801561238d5780601f106123625761010080835404028352916020019161238d565b820191906000526020600020905b81548152906001019060200180831161237057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156124105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016123bb565b505050508152505090506124238161322f565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061247b90613fcb565b90506000036124c2576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906124f290613fcb565b80601f016020809104026020016040519081016040528092919081815260200182805461251e90613fcb565b801561256b5780601f106125405761010080835404028352916020019161256b565b820191906000526020600020905b81548152906001019060200180831161254e57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916125cc90613fcb565b80601f01602080910402602001604051908101604052809291908181526020018280546125f890613fcb565b80156126455780601f1061261a57610100808354040283529160200191612645565b820191906000526020600020905b81548152906001019060200180831161262857829003601f168201915b5050505050815250905060005b86518110156127a2576126c233308984815181106126725761267261401e565b6020026020010151602001518a85815181106126905761269061401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132a1909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106126f2576126f261401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461279a57600254875161279a9173ffffffffffffffffffffffffffffffffffffffff169089908490811061274b5761274b61401e565b6020026020010151602001518984815181106127695761276961401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612fa99092919063ffffffff16565b600101612652565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906127fc908b90869060040161489d565b602060405180830381865afa158015612819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283d919061496a565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906128f657506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156128d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f4919061496a565b105b15612920576008546129209073ffffffffffffffffffffffffffffffffffffffff163330846132a1565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612952576000612954565b825b8a856040518463ffffffff1660e01b815260040161297392919061489d565b60206040518083038185885af1158015612991573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129b6919061496a565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516129e991815260200190565b60405180910390a1505050509392505050565b612a04612a96565b600980547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a8d612a96565b61179e816132ff565b60005473ffffffffffffffffffffffffffffffffffffffff163314610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610cb0565b80600116600103612b5a576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b8e565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612b97816115c6565b6040805160a0810190915260095473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612bef91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612c6957816020015b6040805180820190915260008082526020820152815260200190600190039081612c425790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612cc060025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600860149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612d1092919061489d565b6020604051808303816000875af1158015612d2f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c1919061496a565b6000612d5f83836133f4565b9392505050565b80471015612dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cb0565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e2a576040519150601f19603f3d011682016040523d82523d6000602084013e612e2f565b606091505b50509050806115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261347e565b6000612fa184848461358a565b949350505050565b80158061304957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613047919061496a565b155b6130d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f12565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156131a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c6919061496a565b6131d0919061488a565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506132299085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f12565b50505050565b613237612a96565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890613273908490600401613b12565b600060405180830381600087803b15801561328d57600080fd5b505af11580156113b6573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612f12565b3373ffffffffffffffffffffffffffffffffffffffff82160361337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610cb0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580613418575061341884846135a7565b612d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610cb0565b60006134e0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135b39092919063ffffffff16565b8051909150156115c157808060200190518101906134fe9190614983565b6115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610cb0565b60008281526002840160205260408120829055612fa184846135c2565b6000612d5f83836135ce565b6060612fa184846000856135e6565b6000612d5f83836136ff565b60008181526001830160205260408120541515612d5f565b606082471015613678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610cb0565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136a19190614878565b60006040518083038185875af1925050503d80600081146136de576040519150601f19603f3d011682016040523d82523d6000602084013e6136e3565b606091505b50915091506136f48783838761374e565b979650505050505050565b60008181526001830160205260408120546137465750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561095b565b50600061095b565b606083156137e45782516000036137dd5773ffffffffffffffffffffffffffffffffffffffff85163b6137dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cb0565b5081612fa1565b612fa183838151156137f95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb091906139af565b50805461383990613fcb565b6000825580601f10613849575050565b601f01602090049060005260206000209081019061179e91905b808211156138775760008155600101613863565b5090565b67ffffffffffffffff8116811461179e57600080fd5b6000806000604084860312156138a657600080fd5b83356138b18161387b565b9250602084013567ffffffffffffffff808211156138ce57600080fd5b818601915086601f8301126138e257600080fd5b8135818111156138f157600080fd5b87602082850101111561390357600080fd5b6020830194508093505050509250925092565b801515811461179e57600080fd5b60006020828403121561393657600080fd5b8135612d5f81613916565b60005b8381101561395c578181015183820152602001613944565b50506000910152565b6000815180845261397d816020860160208601613941565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d5f6020830184613965565b6000602082840312156139d457600080fd5b8135612d5f8161387b565b6040815260006139f26040830185613965565b8281036020840152613a048185613965565b95945050505050565b600060208284031215613a1f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179e57600080fd5b60008060408385031215613a5b57600080fd5b8235613a6681613a26565b946020939093013593505050565b600080600060608486031215613a8957600080fd5b8335613a9481613a26565b92506020840135613aa481613a26565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b07578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613aca565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613b4c60c0840182613965565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613b888383613965565b925060808601519150808584030160a086015250613a048282613ab5565b60008060408385031215613bb957600080fd5b823591506020830135613bcb81613a26565b809150509250929050565b60008083601f840112613be857600080fd5b50813567ffffffffffffffff811115613c0057600080fd5b6020830191508360208260051b8501011115613c1b57600080fd5b9250929050565b60008060008060408587031215613c3857600080fd5b843567ffffffffffffffff80821115613c5057600080fd5b613c5c88838901613bd6565b90965094506020870135915080821115613c7557600080fd5b50613c8287828801613bd6565b95989497509550505050565b600060208284031215613ca057600080fd5b813567ffffffffffffffff811115613cb757600080fd5b820160a08185031215612d5f57600080fd5b600060208284031215613cdb57600080fd5b8135612d5f81613a26565b60008060208385031215613cf957600080fd5b823567ffffffffffffffff811115613d1057600080fd5b613d1c85828601613bd6565b90969095509350505050565b60008060408385031215613d3b57600080fd5b8235613d468161387b565b91506020830135613bcb81613a26565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613da857613da8613d56565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613df557613df5613d56565b604052919050565b600082601f830112613e0e57600080fd5b813567ffffffffffffffff811115613e2857613e28613d56565b613e5960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613dae565b818152846020838601011115613e6e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613ea057600080fd5b8335613eab8161387b565b925060208481013567ffffffffffffffff80821115613ec957600080fd5b818701915087601f830112613edd57600080fd5b813581811115613eef57613eef613d56565b613efd848260051b01613dae565b81815260069190911b8301840190848101908a831115613f1c57600080fd5b938501935b82851015613f68576040858c031215613f3a5760008081fd5b613f42613d85565b8535613f4d81613a26565b81528587013587820152825260409094019390850190613f21565b965050506040870135925080831115613f8057600080fd5b5050613f8e86828701613dfd565b9150509250925092565b600060208284031215613faa57600080fd5b813560ff81168114612d5f57600080fd5b8183823760009101908152919050565b600181811c90821680613fdf57607f821691505b602082108103614018577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261408157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140c057600080fd5b83018035915067ffffffffffffffff8211156140db57600080fd5b602001915036819003821315613c1b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261412557600080fd5b830160208101925035905067ffffffffffffffff81111561414557600080fd5b803603821315613c1b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b075781356141c081613a26565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016141ad565b60208152813560208201526000602083013561420d8161387b565b67ffffffffffffffff808216604085015261422b60408601866140f0565b925060a0606086015261424260c086018483614154565b92505061425260608601866140f0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152614288858385614154565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126142c157600080fd5b602092880192830192359150838211156142da57600080fd5b8160061b36038313156142ec57600080fd5b8685030160a08701526136f484828461419d565b601f8211156115c1576000816000526020600020601f850160051c810160208610156143295750805b601f850160051c820191505b818110156121e057828155600101614335565b67ffffffffffffffff83111561436057614360613d56565b6143748361436e8354613fcb565b83614300565b6000601f8411600181146143c657600085156143905750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556113b6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561441557868501358255602094850194600190920191016143f5565b5086821015614450577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561449c81613a26565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561450257614502613d56565b80548382558084101561458f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461454357614543614462565b808616861461455457614554614462565b5060008360005260206000208360011b81018760011b820191505b8082101561458a57828255828483015560028201915061456f565b505050505b5060008181526020812083915b858110156121e0576145ae8383614491565b604092909201916002919091019060010161459c565b813581556001810160208301356145da8161387b565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561461a604086018661408b565b9350915061462c838360028701614348565b614639606086018661408b565b9350915061464b838360038701614348565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261468257600080fd5b91840191823591508082111561469757600080fd5b506020820191508060061b36038213156146b057600080fd5b6132298183600486016144e9565b6000826146f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561470b57600080fd5b8151612d5f81613a26565b815167ffffffffffffffff81111561473057614730613d56565b6147448161473e8454613fcb565b84614300565b602080601f83116001811461479757600084156147615750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556121e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147e4578886015182559484019460019091019084016147c5565b508582101561482057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261408157600080fd5b602081526000612fa1602083018486614154565b60008251614081818460208701613941565b8082018082111561095b5761095b614462565b67ffffffffffffffff83168152604060208201526000825160a060408401526148c960e0840182613965565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526149058383613965565b925060408601519150808584030160808601526149228383613ab5565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149608282613965565b9695505050505050565b60006020828403121561497c57600080fd5b5051919050565b60006020828403121561499557600080fd5b8151612d5f8161391656fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -196,28 +196,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorRaw) Transact(opts *bind. return _SelfFundedPingPong.Contract.contract.Transact(opts, method, params...) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) ACKMESSAGEHEADER() (string, error) { - return _SelfFundedPingPong.Contract.ACKMESSAGEHEADER(&_SelfFundedPingPong.CallOpts) -} - -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) ACKMESSAGEHEADER() (string, error) { - return _SelfFundedPingPong.Contract.ACKMESSAGEHEADER(&_SelfFundedPingPong.CallOpts) -} - func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "getCountIncrBeforeFunding") @@ -468,28 +446,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SFeeToken() (common. 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) SMessageStatus(messageId [32]byte) (uint8, error) { - return _SelfFundedPingPong.Contract.SMessageStatus(&_SelfFundedPingPong.CallOpts, messageId) -} - -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) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "typeAndVersion") @@ -1614,41 +1570,23 @@ func (it *SelfFundedPingPongFeeTokenUpdatedIterator) Close() error { } type SelfFundedPingPongFeeTokenUpdated struct { - OldToken common.Address - NewToken common.Address - Raw types.Log + OldFeeToken common.Address + NewFeeToken common.Address + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenUpdatedIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts) (*SelfFundedPingPongFeeTokenUpdatedIterator, 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, "FeeTokenUpdated", oldTokenRule, newTokenRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "FeeTokenUpdated") if err != nil { return nil, err } return &SelfFundedPingPongFeeTokenUpdatedIterator{contract: _SelfFundedPingPong.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenUpdated, 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) - } +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenUpdated) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "FeeTokenUpdated", oldTokenRule, newTokenRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "FeeTokenUpdated") if err != nil { return nil, err } @@ -1933,240 +1871,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseMessageAbandoned(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 { - MessageId [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 @@ -2483,41 +2187,22 @@ func (it *SelfFundedPingPongMessageSentIterator) Close() error { } type SelfFundedPingPongMessageSent struct { - IncomingMessageId [32]byte - ACKMessageId [32]byte - Raw types.Log + MessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*SelfFundedPingPongMessageSentIterator, error) { - - var incomingMessageIdRule []interface{} - for _, incomingMessageIdItem := range incomingMessageId { - incomingMessageIdRule = append(incomingMessageIdRule, incomingMessageIdItem) - } - var ACKMessageIdRule []interface{} - for _, ACKMessageIdItem := range ACKMessageId { - ACKMessageIdRule = append(ACKMessageIdRule, ACKMessageIdItem) - } +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageSent(opts *bind.FilterOpts) (*SelfFundedPingPongMessageSentIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageSent") if err != nil { return nil, err } return &SelfFundedPingPongMessageSentIterator{contract: _SelfFundedPingPong.contract, event: "MessageSent", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent, 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) - } +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageSent", incomingMessageIdRule, ACKMessageIdRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageSent") if err != nil { return nil, err } @@ -3353,10 +3038,6 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate 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: - return _SelfFundedPingPong.ParseMessageAckSent(log) case _SelfFundedPingPong.abi.Events["MessageFailed"].ID: return _SelfFundedPingPong.ParseMessageFailed(log) case _SelfFundedPingPong.abi.Events["MessageRecovered"].ID: @@ -3417,14 +3098,6 @@ func (SelfFundedPingPongMessageAbandoned) Topic() common.Hash { return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") } -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") } @@ -3434,7 +3107,7 @@ func (SelfFundedPingPongMessageRecovered) Topic() common.Hash { } func (SelfFundedPingPongMessageSent) Topic() common.Hash { - return common.HexToHash("0x9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372") + return common.HexToHash("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") } func (SelfFundedPingPongMessageSucceeded) Topic() common.Hash { @@ -3466,8 +3139,6 @@ func (_SelfFundedPingPong *SelfFundedPingPong) Address() common.Address { } type SelfFundedPingPongInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) - GetCountIncrBeforeFunding(opts *bind.CallOpts) (uint8, error) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) @@ -3492,8 +3163,6 @@ type SelfFundedPingPongInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) - SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -3574,9 +3243,9 @@ type SelfFundedPingPongInterface interface { ParseCountIncrBeforeFundingSet(log types.Log) (*SelfFundedPingPongCountIncrBeforeFundingSet, error) - FilterFeeTokenUpdated(opts *bind.FilterOpts, oldToken []common.Address, newToken []common.Address) (*SelfFundedPingPongFeeTokenUpdatedIterator, error) + FilterFeeTokenUpdated(opts *bind.FilterOpts) (*SelfFundedPingPongFeeTokenUpdatedIterator, error) - WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenUpdated, oldToken []common.Address, newToken []common.Address) (event.Subscription, error) + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongFeeTokenUpdated) (event.Subscription, error) ParseFeeTokenUpdated(log types.Log) (*SelfFundedPingPongFeeTokenUpdated, error) @@ -3592,18 +3261,6 @@ type SelfFundedPingPongInterface interface { ParseMessageAbandoned(log types.Log) (*SelfFundedPingPongMessageAbandoned, 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) @@ -3616,9 +3273,9 @@ type SelfFundedPingPongInterface interface { ParseMessageRecovered(log types.Log) (*SelfFundedPingPongMessageRecovered, error) - FilterMessageSent(opts *bind.FilterOpts, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (*SelfFundedPingPongMessageSentIterator, error) + FilterMessageSent(opts *bind.FilterOpts) (*SelfFundedPingPongMessageSentIterator, error) - WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent, incomingMessageId [][32]byte, ACKMessageId [][32]byte) (event.Subscription, error) + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent) (event.Subscription, error) ParseMessageSent(log types.Log) (*SelfFundedPingPongMessageSent, 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 7075e67b65..7815717d7f 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -5,7 +5,7 @@ burn_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 3f0dfdc726b764afa0dca19c1974a2d50e785423ff2035023f4ca7cf7933e4a6 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 78bd19051a85a8417f317e257d5280e1421ae4aeee8361740948385eb41e1584 ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 446a05c235e14f263764f126ce06602c7035aab4bb984b204d40c89646cd7b09 ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0d7d496ff6aaf37fcf8db25c708b6977c841650027a2028c864f7a0e17fa7b08 ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e6bfb15f1f320cceb76435f49b43c90bfcfc69b4561c811c4b938a6356a23566 @@ -29,12 +29,12 @@ 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 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin e6f9d5162853fdd411df702394d5af7cfaee1d2c90ffd1e50259c0ce6b97f9b8 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin e468bfda33b1726ce175b748383045773022ecbb0dfc7b53f452adba3d7a1307 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 report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin b088de65dc7d7d4e6f7ba534e7c6940e7fe8ba5fa47a120fc7745766a38ec58b +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 4a23adcd2bd9869f48824c0da4896f3d6a8be9f95acf691e312de60a397d0a33 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 e21f356591d54477af615f26ee2b16fb7de8701d Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 15 Jul 2024 18:41:52 -0400 Subject: [PATCH 44/61] fix bug arising from tokenAmounts containing the fee token --- contracts/gas-snapshots/ccip.gas-snapshot | 16 ++++++++-------- .../ccip/applications/external/CCIPClient.sol | 16 +++++++++------- .../applications/external/CCIPClientWithACK.sol | 16 +++++++++------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index b99984485f..175e6a67a4 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -35,15 +35,15 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243568) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientTest:test_HappyPath_Success() (gas: 192504) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326914) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219955) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376823) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326927) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219968) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376836) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331795) CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438714) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348231) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241532) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552182) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 349366) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242666) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 553089) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -703,10 +703,10 @@ 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: 179553) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 179566) PingPong_example_plumbing:test_Pausing_Success() (gas: 17917) PingPong_example_plumbing:test_typeAndVersion() (gas: 9786) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203446) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203459) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 0ecd1fac0e..df324b0885 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -45,6 +45,15 @@ contract CCIPClient is CCIPReceiver { feeToken: address(s_feeToken) }); + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); + + // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken + // Fee transfers need first, that way balanceOf(address(this)) does not conflict with any tokens sent in tokenAmounts + // to support fee-token pre-funding + if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { + IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); + } + 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); @@ -55,13 +64,6 @@ contract CCIPClient is CCIPReceiver { } } - uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - - // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken - if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { - IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); - } - // messageId is only generated in the on-ramp, and therefore cannot be calcualated head of time. // This necessitates breaking CEI but since the router is a trusted contract, any risks are negligible. messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index 0568f2fab2..3c05cad5c5 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -37,6 +37,15 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { feeToken: address(s_feeToken) }); + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); + + // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken + // Fee transfers need first, that way balanceOf(address(this)) does not conflict with any tokens sent in tokenAmounts + // to support fee-token pre-funding + if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { + IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); + } + 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); @@ -47,13 +56,6 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { } } - uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - - // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken - if (address(s_feeToken) != address(0)) { - IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); - } - messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( destChainSelector, message ); From ba0a487ad4f6e26796394225655bbc98b7a8cf7e 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, 15 Jul 2024 22:55:09 +0000 Subject: [PATCH 45/61] Update gethwrappers --- core/gethwrappers/ccip/generated/ccipClient/ccipClient.go | 2 +- .../ccip/generated/ccipClientWithACK/ccipClientWithACK.go | 2 +- .../ccip/generated/ping_pong_demo/ping_pong_demo.go | 2 +- .../self_funded_ping_pong/self_funded_ping_pong.go | 2 +- .../generated-wrapper-dependency-versions-do-not-edit.txt | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 5167ea5517..2d5a4f6d02 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -57,7 +57,7 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620043da380380620043da8339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600880549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613d1480620006c66000396000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103fb578063f2fde38b1461040e578063ff2deec31461042e57600080fd5b8063cf6730f8146103bb578063e4ca8754146103db57600080fd5b8063b0f479a1116100a5578063b0f479a114610350578063c851cc321461037b578063c89245d51461039b57600080fd5b80638da5cb5b146102e45780639fe74e261461033057600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba50971461028f5780638462a2b9146102a457806385572ffb146102c457600080fd5b80636939cd97146102425780636d62d6331461026f57600080fd5b80635075a9d4116101485780635075a9d4146101d2578063536c6bfa146102005780635e35359e1461022257600080fd5b80630e958d6b1461016f57806335f170ef146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612db3565b61045b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004612e38565b6104a6565b60405161019b929190612ec3565b3480156101de57600080fd5b506101f26101ed366004612ef1565b6105d2565b60405190815260200161019b565b34801561020c57600080fd5b5061022061021b366004612f2c565b6105e5565b005b34801561022e57600080fd5b5061022061023d366004612f58565b610649565b34801561024e57600080fd5b5061026261025d366004612ef1565b6106de565b60405161019b9190612ff6565b34801561027b57600080fd5b5061022061028a36600461308a565b6108e9565b34801561029b57600080fd5b50610220610c03565b3480156102b057600080fd5b506102206102bf366004613106565b610d00565b3480156102d057600080fd5b506102206102df366004613172565b611041565b3480156102f057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561033c57600080fd5b5061022061034b3660046131ad565b61124a565b34801561035c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661030b565b34801561038757600080fd5b506102206103963660046131ef565b6115db565b3480156103a757600080fd5b506102206103b63660046131ef565b6116a7565b3480156103c757600080fd5b506102206103d6366004613172565b611811565b3480156103e757600080fd5b506102206103f6366004612ef1565b6119ca565b6101f2610409366004613341565b611c34565b34801561041a57600080fd5b506102206104293660046131ef565b6121de565b34801561043a57600080fd5b5060085461030b9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061048a908590859061344e565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104c19061345e565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061345e565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b50505050509080600101805461054f9061345e565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061345e565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905082565b60006105df6005836121f2565b92915050565b6105ed612205565b6105f78282612288565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610651612205565b61067273ffffffffffffffffffffffffffffffffffffffff841683836123e2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106d191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161074d9061345e565b80601f01602080910402602001604051908101604052809291908181526020018280546107799061345e565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b505050505081526020016003820180546107df9061345e565b80601f016020809104026020016040519081016040528092919081815260200182805461080b9061345e565b80156108585780601f1061082d57610100808354040283529160200191610858565b820191906000526020600020905b81548152906001019060200180831161083b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108db5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610886565b505050915250909392505050565b6108f1612205565b60016108fe6005846121f2565b1461093d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61094d8260025b600591906124b6565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916109959061345e565b80601f01602080910402602001604051908101604052809291908181526020018280546109c19061345e565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b50505050508152602001600382018054610a279061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a539061345e565b8015610aa05780601f10610a7557610100808354040283529160200191610aa0565b820191906000526020600020905b815481529060010190602001808311610a8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ace565b5050505081525050905060005b816080015151811015610bb257610baa8383608001518381518110610b5757610b576134b1565b60200260200101516020015184608001518481518110610b7957610b796134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123e29092919063ffffffff16565b600101610b30565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610934565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d08612205565b60005b81811015610e9b5760036000848484818110610d2957610d296134b1565b9050602002810190610d3b91906134e0565b610d49906020810190612e38565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d8057610d806134b1565b9050602002810190610d9291906134e0565b610da090602081019061351e565b604051610dae92919061344e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610df557610df56134b1565b9050602002810190610e0791906134e0565b610e1590602081019061351e565b604051610e2392919061344e565b6040518091039020838383818110610e3d57610e3d6134b1565b9050602002810190610e4f91906134e0565b610e5d906020810190612e38565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d0b565b5060005b8381101561103a57600160036000878785818110610ebf57610ebf6134b1565b9050602002810190610ed191906134e0565b610edf906020810190612e38565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f1657610f166134b1565b9050602002810190610f2891906134e0565b610f3690602081019061351e565b604051610f4492919061344e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f9457610f946134b1565b9050602002810190610fa691906134e0565b610fb490602081019061351e565b604051610fc292919061344e565b6040518091039020858583818110610fdc57610fdc6134b1565b9050602002810190610fee91906134e0565b610ffc906020810190612e38565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e9f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611094576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6110a46040820160208301612e38565b67ffffffffffffffff81166000908152600360205260409020805481906110ca9061345e565b9050600003611111576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061114d908690600401613685565b600060405180830381600087803b15801561116757600080fd5b505af1925050508015611178575060015b611218573d8080156111a6576040519150601f19603f3d011682016040523d82523d6000602084013e6111ab565b606091505b506111b884356001610944565b508335600090815260046020526040902084906111d58282613a5f565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061120a908490613b59565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611252612205565b60005b818110156112455782828281811061126f5761126f6134b1565b90506020028101906112819190613b6c565b611292906040810190602001613bae565b61135e57600360008484848181106112ac576112ac6134b1565b90506020028101906112be9190613b6c565b6112cc906020810190612e38565b67ffffffffffffffff168152602081019190915260400160009081206112f191612d4f565b828282818110611303576113036134b1565b90506020028101906113159190613b6c565b611323906020810190612e38565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26115d3565b828282818110611370576113706134b1565b90506020028101906113829190613b6c565b61139090604081019061351e565b90506000036113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113e3576113e36134b1565b90506020028101906113f59190613b6c565b611403906020810190612e38565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611439576114396134b1565b905060200281019061144b9190613b6c565b61145990604081019061351e565b82916114669190836137e3565b50838383818110611479576114796134b1565b905060200281019061148b9190613b6c565b61149990606081019061351e565b1590506114e4578383838181106114b2576114b26134b1565b90506020028101906114c49190613b6c565b6114d290606081019061351e565b60018301916114e29190836137e3565b505b8383838181106114f6576114f66134b1565b90506020028101906115089190613b6c565b61151690604081019061351e565b60405161152492919061344e565b604051809103902084848481811061153e5761153e6134b1565b90506020028101906115509190613b6c565b61155e906020810190612e38565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061159b5761159b6134b1565b90506020028101906115ad9190613b6c565b6115bb90606081019061351e565b6040516115c9929190613bcb565b60405180910390a3505b600101611255565b6115e3612205565b73ffffffffffffffffffffffffffffffffffffffff8116611630576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6116af612205565b60085473ffffffffffffffffffffffffffffffffffffffff1615611710576117106116ef60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006124cb565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156117bd576117bd61177d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61264d565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461184a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185a6040820160208301612e38565b611867604083018361351e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506118be9250905061345e565b159050806119145750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516118ff9190613bdf565b9081526040519081900360200190205460ff16155b1561194d57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109349190613b59565b61195d6040840160208501612e38565b67ffffffffffffffff81166000908152600360205260409020805481906119839061345e565b905060000361103a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b60016119d76005836121f2565b14611a11576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610934565b611a1c816000610944565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611a649061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a909061345e565b8015611add5780601f10611ab257610100808354040283529160200191611add565b820191906000526020600020905b815481529060010190602001808311611ac057829003601f168201915b50505050508152602001600382018054611af69061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b229061345e565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611bf25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611b9d565b50505050815250509050611c0581612751565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c5d9061345e565b9050600003611ca4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611cd49061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d009061345e565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611dae9061345e565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda9061345e565b8015611e275780601f10611dfc57610100808354040283529160200191611e27565b820191906000526020600020905b815481529060010190602001808311611e0a57829003601f168201915b5050505050815250905060005b8651811015611f8457611ea43330898481518110611e5457611e546134b1565b6020026020010151602001518a8581518110611e7257611e726134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127c3909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611ed457611ed46134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611f7c576002548751611f7c9173ffffffffffffffffffffffffffffffffffffffff1690899084908110611f2d57611f2d6134b1565b602002602001015160200151898481518110611f4b57611f4b6134b1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124cb9092919063ffffffff16565b600101611e34565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611fde908b908690600401613bf1565b602060405180830381865afa158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f9190613cbe565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906120d857506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d69190613cbe565b105b15612102576008546121029073ffffffffffffffffffffffffffffffffffffffff163330846127c3565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612134576000612136565b825b8a856040518463ffffffff1660e01b8152600401612155929190613bf1565b60206040518083038185885af1158015612173573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121989190613cbe565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516121cb91815260200190565b60405180910390a1505050509392505050565b6121e6612205565b6121ef81612821565b50565b60006121fe8383612916565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610934565b565b804710156122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461234c576040519150601f19603f3d011682016040523d82523d6000602084013e612351565b606091505b5050905080611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526129a0565b60006124c3848484612aac565b949350505050565b80158061256b57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125699190613cbe565b155b6125f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612434565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190613cbe565b6126f29190613cd7565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061274b9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612434565b50505050565b612759612205565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612795908490600401612ff6565b600060405180830381600087803b1580156127af57600080fd5b505af115801561103a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261274b9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612434565b3373ffffffffffffffffffffffffffffffffffffffff8216036128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610934565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061293a575061293a8484612ac9565b6121fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610934565b6000612a02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ad59092919063ffffffff16565b8051909150156112455780806020019051810190612a209190613cea565b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610934565b600082815260028401602052604081208290556124c38484612ae4565b60006121fe8383612af0565b60606124c38484600085612b08565b60006121fe8383612c21565b600081815260018301602052604081205415156121fe565b606082471015612b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610934565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612bc39190613bdf565b60006040518083038185875af1925050503d8060008114612c00576040519150601f19603f3d011682016040523d82523d6000602084013e612c05565b606091505b5091509150612c1687838387612c70565b979650505050505050565b6000818152600183016020526040812054612c68575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105df565b5060006105df565b60608315612d06578251600003612cff5773ffffffffffffffffffffffffffffffffffffffff85163b612cff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b50816124c3565b6124c38383815115612d1b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349190613b59565b508054612d5b9061345e565b6000825580601f10612d6b575050565b601f0160209004906000526020600020908101906121ef91905b80821115612d995760008155600101612d85565b5090565b67ffffffffffffffff811681146121ef57600080fd5b600080600060408486031215612dc857600080fd5b8335612dd381612d9d565b9250602084013567ffffffffffffffff80821115612df057600080fd5b818601915086601f830112612e0457600080fd5b813581811115612e1357600080fd5b876020828501011115612e2557600080fd5b6020830194508093505050509250925092565b600060208284031215612e4a57600080fd5b81356121fe81612d9d565b60005b83811015612e70578181015183820152602001612e58565b50506000910152565b60008151808452612e91816020860160208601612e55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612ed66040830185612e79565b8281036020840152612ee88185612e79565b95945050505050565b600060208284031215612f0357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146121ef57600080fd5b60008060408385031215612f3f57600080fd5b8235612f4a81612f0a565b946020939093013593505050565b600080600060608486031215612f6d57600080fd5b8335612f7881612f0a565b92506020840135612f8881612f0a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612feb578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fae565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303060c0840182612e79565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261306c8383612e79565b925060808601519150808584030160a086015250612ee88282612f99565b6000806040838503121561309d57600080fd5b8235915060208301356130af81612f0a565b809150509250929050565b60008083601f8401126130cc57600080fd5b50813567ffffffffffffffff8111156130e457600080fd5b6020830191508360208260051b85010111156130ff57600080fd5b9250929050565b6000806000806040858703121561311c57600080fd5b843567ffffffffffffffff8082111561313457600080fd5b613140888389016130ba565b9096509450602087013591508082111561315957600080fd5b50613166878288016130ba565b95989497509550505050565b60006020828403121561318457600080fd5b813567ffffffffffffffff81111561319b57600080fd5b820160a081850312156121fe57600080fd5b600080602083850312156131c057600080fd5b823567ffffffffffffffff8111156131d757600080fd5b6131e3858286016130ba565b90969095509350505050565b60006020828403121561320157600080fd5b81356121fe81612f0a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561325e5761325e61320c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132ab576132ab61320c565b604052919050565b600082601f8301126132c457600080fd5b813567ffffffffffffffff8111156132de576132de61320c565b61330f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613264565b81815284602083860101111561332457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561335657600080fd5b833561336181612d9d565b925060208481013567ffffffffffffffff8082111561337f57600080fd5b818701915087601f83011261339357600080fd5b8135818111156133a5576133a561320c565b6133b3848260051b01613264565b81815260069190911b8301840190848101908a8311156133d257600080fd5b938501935b8285101561341e576040858c0312156133f05760008081fd5b6133f861323b565b853561340381612f0a565b815285870135878201528252604090940193908501906133d7565b96505050604087013592508083111561343657600080fd5b5050613444868287016132b3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061347257607f821691505b6020821081036134ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261351457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261355357600080fd5b83018035915067ffffffffffffffff82111561356e57600080fd5b6020019150368190038213156130ff57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135b857600080fd5b830160208101925035905067ffffffffffffffff8111156135d857600080fd5b8036038213156130ff57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612feb57813561365381612f0a565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613640565b6020815281356020820152600060208301356136a081612d9d565b67ffffffffffffffff80821660408501526136be6040860186613583565b925060a060608601526136d560c0860184836135e7565b9250506136e56060860186613583565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261371b8583856135e7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261375457600080fd5b6020928801928301923591508382111561376d57600080fd5b8160061b360383131561377f57600080fd5b8685030160a0870152612c16848284613630565b601f821115611245576000816000526020600020601f850160051c810160208610156137bc5750805b601f850160051c820191505b818110156137db578281556001016137c8565b505050505050565b67ffffffffffffffff8311156137fb576137fb61320c565b61380f83613809835461345e565b83613793565b6000601f841160018114613861576000851561382b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561103a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156138b05786850135825560209485019460019092019101613890565b50868210156138eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561393781612f0a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561399d5761399d61320c565b805483825580841015613a2a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146139de576139de6138fd565b80861686146139ef576139ef6138fd565b5060008360005260206000208360011b81018760011b820191505b80821015613a25578282558284830155600282019150613a0a565b505050505b5060008181526020812083915b858110156137db57613a49838361392c565b6040929092019160029190910190600101613a37565b81358155600181016020830135613a7581612d9d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ab5604086018661351e565b93509150613ac78383600287016137e3565b613ad4606086018661351e565b93509150613ae68383600387016137e3565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b1d57600080fd5b918401918235915080821115613b3257600080fd5b506020820191508060061b3603821315613b4b57600080fd5b61274b818360048601613984565b6020815260006121fe6020830184612e79565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261351457600080fd5b80151581146121ef57600080fd5b600060208284031215613bc057600080fd5b81356121fe81613ba0565b6020815260006124c36020830184866135e7565b60008251613514818460208701612e55565b67ffffffffffffffff83168152604060208201526000825160a06040840152613c1d60e0840182612e79565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613c598383612e79565b92506040860151915080858403016080860152613c768383612f99565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613cb48282612e79565b9695505050505050565b600060208284031215613cd057600080fd5b5051919050565b808201808211156105df576105df6138fd565b600060208284031215613cfc57600080fd5b81516121fe81613ba056fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b50604051620043de380380620043de8339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600880549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613d1880620006c66000396000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103fb578063f2fde38b1461040e578063ff2deec31461042e57600080fd5b8063cf6730f8146103bb578063e4ca8754146103db57600080fd5b8063b0f479a1116100a5578063b0f479a114610350578063c851cc321461037b578063c89245d51461039b57600080fd5b80638da5cb5b146102e45780639fe74e261461033057600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba50971461028f5780638462a2b9146102a457806385572ffb146102c457600080fd5b80636939cd97146102425780636d62d6331461026f57600080fd5b80635075a9d4116101485780635075a9d4146101d2578063536c6bfa146102005780635e35359e1461022257600080fd5b80630e958d6b1461016f57806335f170ef146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612db7565b61045b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004612e3c565b6104a6565b60405161019b929190612ec7565b3480156101de57600080fd5b506101f26101ed366004612ef5565b6105d2565b60405190815260200161019b565b34801561020c57600080fd5b5061022061021b366004612f30565b6105e5565b005b34801561022e57600080fd5b5061022061023d366004612f5c565b610649565b34801561024e57600080fd5b5061026261025d366004612ef5565b6106de565b60405161019b9190612ffa565b34801561027b57600080fd5b5061022061028a36600461308e565b6108e9565b34801561029b57600080fd5b50610220610c03565b3480156102b057600080fd5b506102206102bf36600461310a565b610d00565b3480156102d057600080fd5b506102206102df366004613176565b611041565b3480156102f057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561033c57600080fd5b5061022061034b3660046131b1565b61124a565b34801561035c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661030b565b34801561038757600080fd5b506102206103963660046131f3565b6115db565b3480156103a757600080fd5b506102206103b63660046131f3565b6116a7565b3480156103c757600080fd5b506102206103d6366004613176565b611811565b3480156103e757600080fd5b506102206103f6366004612ef5565b6119ca565b6101f2610409366004613345565b611c34565b34801561041a57600080fd5b506102206104293660046131f3565b6121e2565b34801561043a57600080fd5b5060085461030b9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061048a9085908590613452565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104c190613462565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed90613462565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b50505050509080600101805461054f90613462565b80601f016020809104026020016040519081016040528092919081815260200182805461057b90613462565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905082565b60006105df6005836121f6565b92915050565b6105ed612209565b6105f7828261228c565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610651612209565b61067273ffffffffffffffffffffffffffffffffffffffff841683836123e6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106d191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161074d90613462565b80601f016020809104026020016040519081016040528092919081815260200182805461077990613462565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b505050505081526020016003820180546107df90613462565b80601f016020809104026020016040519081016040528092919081815260200182805461080b90613462565b80156108585780601f1061082d57610100808354040283529160200191610858565b820191906000526020600020905b81548152906001019060200180831161083b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108db5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610886565b505050915250909392505050565b6108f1612209565b60016108fe6005846121f6565b1461093d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61094d8260025b600591906124ba565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161099590613462565b80601f01602080910402602001604051908101604052809291908181526020018280546109c190613462565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b50505050508152602001600382018054610a2790613462565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5390613462565b8015610aa05780601f10610a7557610100808354040283529160200191610aa0565b820191906000526020600020905b815481529060010190602001808311610a8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ace565b5050505081525050905060005b816080015151811015610bb257610baa8383608001518381518110610b5757610b576134b5565b60200260200101516020015184608001518481518110610b7957610b796134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123e69092919063ffffffff16565b600101610b30565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610934565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d08612209565b60005b81811015610e9b5760036000848484818110610d2957610d296134b5565b9050602002810190610d3b91906134e4565b610d49906020810190612e3c565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d8057610d806134b5565b9050602002810190610d9291906134e4565b610da0906020810190613522565b604051610dae929190613452565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610df557610df56134b5565b9050602002810190610e0791906134e4565b610e15906020810190613522565b604051610e23929190613452565b6040518091039020838383818110610e3d57610e3d6134b5565b9050602002810190610e4f91906134e4565b610e5d906020810190612e3c565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d0b565b5060005b8381101561103a57600160036000878785818110610ebf57610ebf6134b5565b9050602002810190610ed191906134e4565b610edf906020810190612e3c565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f1657610f166134b5565b9050602002810190610f2891906134e4565b610f36906020810190613522565b604051610f44929190613452565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f9457610f946134b5565b9050602002810190610fa691906134e4565b610fb4906020810190613522565b604051610fc2929190613452565b6040518091039020858583818110610fdc57610fdc6134b5565b9050602002810190610fee91906134e4565b610ffc906020810190612e3c565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e9f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611094576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6110a46040820160208301612e3c565b67ffffffffffffffff81166000908152600360205260409020805481906110ca90613462565b9050600003611111576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061114d908690600401613689565b600060405180830381600087803b15801561116757600080fd5b505af1925050508015611178575060015b611218573d8080156111a6576040519150601f19603f3d011682016040523d82523d6000602084013e6111ab565b606091505b506111b884356001610944565b508335600090815260046020526040902084906111d58282613a63565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061120a908490613b5d565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611252612209565b60005b818110156112455782828281811061126f5761126f6134b5565b90506020028101906112819190613b70565b611292906040810190602001613bb2565b61135e57600360008484848181106112ac576112ac6134b5565b90506020028101906112be9190613b70565b6112cc906020810190612e3c565b67ffffffffffffffff168152602081019190915260400160009081206112f191612d53565b828282818110611303576113036134b5565b90506020028101906113159190613b70565b611323906020810190612e3c565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26115d3565b828282818110611370576113706134b5565b90506020028101906113829190613b70565b611390906040810190613522565b90506000036113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113e3576113e36134b5565b90506020028101906113f59190613b70565b611403906020810190612e3c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611439576114396134b5565b905060200281019061144b9190613b70565b611459906040810190613522565b82916114669190836137e7565b50838383818110611479576114796134b5565b905060200281019061148b9190613b70565b611499906060810190613522565b1590506114e4578383838181106114b2576114b26134b5565b90506020028101906114c49190613b70565b6114d2906060810190613522565b60018301916114e29190836137e7565b505b8383838181106114f6576114f66134b5565b90506020028101906115089190613b70565b611516906040810190613522565b604051611524929190613452565b604051809103902084848481811061153e5761153e6134b5565b90506020028101906115509190613b70565b61155e906020810190612e3c565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061159b5761159b6134b5565b90506020028101906115ad9190613b70565b6115bb906060810190613522565b6040516115c9929190613bcf565b60405180910390a3505b600101611255565b6115e3612209565b73ffffffffffffffffffffffffffffffffffffffff8116611630576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6116af612209565b60085473ffffffffffffffffffffffffffffffffffffffff1615611710576117106116ef60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006124cf565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156117bd576117bd61177d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612651565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461184a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185a6040820160208301612e3c565b6118676040830183613522565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506118be92509050613462565b159050806119145750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516118ff9190613be3565b9081526040519081900360200190205460ff16155b1561194d57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109349190613b5d565b61195d6040840160208501612e3c565b67ffffffffffffffff811660009081526003602052604090208054819061198390613462565b905060000361103a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b60016119d76005836121f6565b14611a11576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610934565b611a1c816000610944565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611a6490613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9090613462565b8015611add5780601f10611ab257610100808354040283529160200191611add565b820191906000526020600020905b815481529060010190602001808311611ac057829003601f168201915b50505050508152602001600382018054611af690613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2290613462565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611bf25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611b9d565b50505050815250509050611c0581612755565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c5d90613462565b9050600003611ca4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611cd490613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0090613462565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611dae90613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda90613462565b8015611e275780601f10611dfc57610100808354040283529160200191611e27565b820191906000526020600020905b815481529060010190602001808311611e0a57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611e8e908b908690600401613bf5565b602060405180830381865afa158015611eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecf9190613cc2565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615801590611f8857506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f869190613cc2565b105b15611fb257600854611fb29073ffffffffffffffffffffffffffffffffffffffff163330846127c7565b60005b87518110156121055761202533308a8481518110611fd557611fd56134b5565b6020026020010151602001518b8581518110611ff357611ff36134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127c7909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110612055576120556134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120fd5760025488516120fd9173ffffffffffffffffffffffffffffffffffffffff16908a90849081106120ae576120ae6134b5565b6020026020010151602001518a84815181106120cc576120cc6134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124cf9092919063ffffffff16565b600101611fb5565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561213857600061213a565b825b8a856040518463ffffffff1660e01b8152600401612159929190613bf5565b60206040518083038185885af1158015612177573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061219c9190613cc2565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516121cf91815260200190565b60405180910390a1505050509392505050565b6121ea612209565b6121f381612825565b50565b6000612202838361291a565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610934565b565b804710156122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612350576040519150601f19603f3d011682016040523d82523d6000602084013e612355565b606091505b5050905080611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526129a4565b60006124c7848484612ab0565b949350505050565b80158061256f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190613cc2565b155b6125fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612438565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ec9190613cc2565b6126f69190613cdb565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061274f9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612438565b50505050565b61275d612209565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612799908490600401612ffa565b600060405180830381600087803b1580156127b357600080fd5b505af115801561103a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261274f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612438565b3373ffffffffffffffffffffffffffffffffffffffff8216036128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610934565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061293e575061293e8484612acd565b612202576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610934565b6000612a06826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ad99092919063ffffffff16565b8051909150156112455780806020019051810190612a249190613cee565b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610934565b600082815260028401602052604081208290556124c78484612ae8565b60006122028383612af4565b60606124c78484600085612b0c565b60006122028383612c25565b60008181526001830160205260408120541515612202565b606082471015612b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610934565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612bc79190613be3565b60006040518083038185875af1925050503d8060008114612c04576040519150601f19603f3d011682016040523d82523d6000602084013e612c09565b606091505b5091509150612c1a87838387612c74565b979650505050505050565b6000818152600183016020526040812054612c6c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105df565b5060006105df565b60608315612d0a578251600003612d035773ffffffffffffffffffffffffffffffffffffffff85163b612d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b50816124c7565b6124c78383815115612d1f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349190613b5d565b508054612d5f90613462565b6000825580601f10612d6f575050565b601f0160209004906000526020600020908101906121f391905b80821115612d9d5760008155600101612d89565b5090565b67ffffffffffffffff811681146121f357600080fd5b600080600060408486031215612dcc57600080fd5b8335612dd781612da1565b9250602084013567ffffffffffffffff80821115612df457600080fd5b818601915086601f830112612e0857600080fd5b813581811115612e1757600080fd5b876020828501011115612e2957600080fd5b6020830194508093505050509250925092565b600060208284031215612e4e57600080fd5b813561220281612da1565b60005b83811015612e74578181015183820152602001612e5c565b50506000910152565b60008151808452612e95816020860160208601612e59565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612eda6040830185612e7d565b8281036020840152612eec8185612e7d565b95945050505050565b600060208284031215612f0757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146121f357600080fd5b60008060408385031215612f4357600080fd5b8235612f4e81612f0e565b946020939093013593505050565b600080600060608486031215612f7157600080fd5b8335612f7c81612f0e565b92506020840135612f8c81612f0e565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612fef578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fb2565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303460c0840182612e7d565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130708383612e7d565b925060808601519150808584030160a086015250612eec8282612f9d565b600080604083850312156130a157600080fd5b8235915060208301356130b381612f0e565b809150509250929050565b60008083601f8401126130d057600080fd5b50813567ffffffffffffffff8111156130e857600080fd5b6020830191508360208260051b850101111561310357600080fd5b9250929050565b6000806000806040858703121561312057600080fd5b843567ffffffffffffffff8082111561313857600080fd5b613144888389016130be565b9096509450602087013591508082111561315d57600080fd5b5061316a878288016130be565b95989497509550505050565b60006020828403121561318857600080fd5b813567ffffffffffffffff81111561319f57600080fd5b820160a0818503121561220257600080fd5b600080602083850312156131c457600080fd5b823567ffffffffffffffff8111156131db57600080fd5b6131e7858286016130be565b90969095509350505050565b60006020828403121561320557600080fd5b813561220281612f0e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561326257613262613210565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132af576132af613210565b604052919050565b600082601f8301126132c857600080fd5b813567ffffffffffffffff8111156132e2576132e2613210565b61331360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613268565b81815284602083860101111561332857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561335a57600080fd5b833561336581612da1565b925060208481013567ffffffffffffffff8082111561338357600080fd5b818701915087601f83011261339757600080fd5b8135818111156133a9576133a9613210565b6133b7848260051b01613268565b81815260069190911b8301840190848101908a8311156133d657600080fd5b938501935b82851015613422576040858c0312156133f45760008081fd5b6133fc61323f565b853561340781612f0e565b815285870135878201528252604090940193908501906133db565b96505050604087013592508083111561343a57600080fd5b5050613448868287016132b7565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061347657607f821691505b6020821081036134af577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261351857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261355757600080fd5b83018035915067ffffffffffffffff82111561357257600080fd5b60200191503681900382131561310357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135bc57600080fd5b830160208101925035905067ffffffffffffffff8111156135dc57600080fd5b80360382131561310357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612fef57813561365781612f0e565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613644565b6020815281356020820152600060208301356136a481612da1565b67ffffffffffffffff80821660408501526136c26040860186613587565b925060a060608601526136d960c0860184836135eb565b9250506136e96060860186613587565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261371f8583856135eb565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261375857600080fd5b6020928801928301923591508382111561377157600080fd5b8160061b360383131561378357600080fd5b8685030160a0870152612c1a848284613634565b601f821115611245576000816000526020600020601f850160051c810160208610156137c05750805b601f850160051c820191505b818110156137df578281556001016137cc565b505050505050565b67ffffffffffffffff8311156137ff576137ff613210565b6138138361380d8354613462565b83613797565b6000601f841160018114613865576000851561382f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561103a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156138b45786850135825560209485019460019092019101613894565b50868210156138ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561393b81612f0e565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156139a1576139a1613210565b805483825580841015613a2e5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146139e2576139e2613901565b80861686146139f3576139f3613901565b5060008360005260206000208360011b81018760011b820191505b80821015613a29578282558284830155600282019150613a0e565b505050505b5060008181526020812083915b858110156137df57613a4d8383613930565b6040929092019160029190910190600101613a3b565b81358155600181016020830135613a7981612da1565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ab96040860186613522565b93509150613acb8383600287016137e7565b613ad86060860186613522565b93509150613aea8383600387016137e7565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b2157600080fd5b918401918235915080821115613b3657600080fd5b506020820191508060061b3603821315613b4f57600080fd5b61274f818360048601613988565b6020815260006122026020830184612e7d565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261351857600080fd5b80151581146121f357600080fd5b600060208284031215613bc457600080fd5b813561220281613ba4565b6020815260006124c76020830184866135eb565b60008251613518818460208701612e59565b67ffffffffffffffff83168152604060208201526000825160a06040840152613c2160e0840182612e7d565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613c5d8383612e7d565b92506040860151915080858403016080860152613c7a8383612f9d565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613cb88282612e7d565b9695505050505050565b600060208284031215613cd457600080fd5b5051919050565b808201808211156105df576105df613901565b600060208284031215613d0057600080fd5b815161220281613ba456fea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go index 99da9a0a1d..e422a70d4b 100644 --- a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go +++ b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go @@ -57,7 +57,7 @@ type ClientEVMTokenAmount struct { var CCIPClientWithACKMetaData = &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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004aea38038062004aea833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b61444c806200069e6000396000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063c89245d514610448578063cf6730f814610468578063e4ca87541461048857600080fd5b80639fe74e26116100b05780639fe74e26146103dd578063b0f479a1146103fd578063c851cc321461042857600080fd5b806385572ffb146103715780638da5cb5b1461039157600080fd5b80635e35359e1161012d5780636fef519e116101075780636fef519e146102e657806379ba50971461033c5780638462a2b91461035157600080fd5b80635e35359e146102795780636939cd97146102995780636d62d633146102c657600080fd5b806335f170ef1161015e57806335f170ef146101fb5780635075a9d414610229578063536c6bfa1461025757600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a03660046132e5565b60096020526000908152604090205460ff1681565b6040516101c2919061332d565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613384565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b610216366004613409565b610553565b6040516101c2929190613494565b34801561023557600080fd5b506102496102443660046132e5565b61067f565b6040519081526020016101c2565b34801561026357600080fd5b506102776102723660046134e4565b610692565b005b34801561028557600080fd5b50610277610294366004613510565b6106f6565b3480156102a557600080fd5b506102b96102b43660046132e5565b61078b565b6040516101c291906135ae565b3480156102d257600080fd5b506102776102e1366004613642565b610996565b3480156102f257600080fd5b5061032f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c29190613672565b34801561034857600080fd5b50610277610cb0565b34801561035d57600080fd5b5061027761036c3660046136d1565b610dad565b34801561037d57600080fd5b5061027761038c36600461373d565b6110ee565b34801561039d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103e957600080fd5b506102776103f8366004613778565b6112f7565b34801561040957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103b8565b34801561043457600080fd5b506102776104433660046137ba565b611688565b34801561045457600080fd5b506102776104633660046137ba565b611754565b34801561047457600080fd5b5061027761048336600461373d565b6118c8565b34801561049457600080fd5b506102776104a33660046132e5565b611c16565b6102496104b636600461393d565b611e80565b3480156104c757600080fd5b506102776104d63660046137ba565b6123b6565b3480156104e757600080fd5b506008546103b89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105379085908590613a4a565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061056e90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461059a90613a5a565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b5050505050908060010180546105fc90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461062890613a5a565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905082565b600061068c6005836123ca565b92915050565b61069a6123dd565b6106a48282612460565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6106fe6123dd565b61071f73ffffffffffffffffffffffffffffffffffffffff841683836125ba565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161077e91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107fa90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461082690613a5a565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160038201805461088c90613a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890613a5a565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109885760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610933565b505050915250909392505050565b61099e6123dd565b60016109ab6005846123ca565b146109ea576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109fa8260025b6005919061268e565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610a4290613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90613a5a565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b50505050508152602001600382018054610ad490613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090613a5a565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bd05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b7b565b5050505081525050905060005b816080015151811015610c5f57610c578383608001518381518110610c0457610c04613aad565b60200260200101516020015184608001518481518110610c2657610c26613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125ba9092919063ffffffff16565b600101610bdd565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109e1565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610db56123dd565b60005b81811015610f485760036000848484818110610dd657610dd6613aad565b9050602002810190610de89190613adc565b610df6906020810190613409565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e2d57610e2d613aad565b9050602002810190610e3f9190613adc565b610e4d906020810190613b1a565b604051610e5b929190613a4a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ea257610ea2613aad565b9050602002810190610eb49190613adc565b610ec2906020810190613b1a565b604051610ed0929190613a4a565b6040518091039020838383818110610eea57610eea613aad565b9050602002810190610efc9190613adc565b610f0a906020810190613409565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610db8565b5060005b838110156110e757600160036000878785818110610f6c57610f6c613aad565b9050602002810190610f7e9190613adc565b610f8c906020810190613409565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fc357610fc3613aad565b9050602002810190610fd59190613adc565b610fe3906020810190613b1a565b604051610ff1929190613a4a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061104157611041613aad565b90506020028101906110539190613adc565b611061906020810190613b1a565b60405161106f929190613a4a565b604051809103902085858381811061108957611089613aad565b905060200281019061109b9190613adc565b6110a9906020810190613409565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f4c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611141576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109e1565b6111516040820160208301613409565b67ffffffffffffffff811660009081526003602052604090208054819061117790613a5a565b90506000036111be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906111fa908690600401613c81565b600060405180830381600087803b15801561121457600080fd5b505af1925050508015611225575060015b6112c5573d808015611253576040519150601f19603f3d011682016040523d82523d6000602084013e611258565b606091505b50611265843560016109f1565b50833560009081526004602052604090208490611282828261405b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112b7908490613672565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6112ff6123dd565b60005b818110156112f25782828281811061131c5761131c613aad565b905060200281019061132e9190614155565b61133f906040810190602001614197565b61140b576003600084848481811061135957611359613aad565b905060200281019061136b9190614155565b611379906020810190613409565b67ffffffffffffffff1681526020810191909152604001600090812061139e91613297565b8282828181106113b0576113b0613aad565b90506020028101906113c29190614155565b6113d0906020810190613409565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611680565b82828281811061141d5761141d613aad565b905060200281019061142f9190614155565b61143d906040810190613b1a565b9050600003611478576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061149057611490613aad565b90506020028101906114a29190614155565b6114b0906020810190613409565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106114e6576114e6613aad565b90506020028101906114f89190614155565b611506906040810190613b1a565b8291611513919083613ddf565b5083838381811061152657611526613aad565b90506020028101906115389190614155565b611546906060810190613b1a565b1590506115915783838381811061155f5761155f613aad565b90506020028101906115719190614155565b61157f906060810190613b1a565b600183019161158f919083613ddf565b505b8383838181106115a3576115a3613aad565b90506020028101906115b59190614155565b6115c3906040810190613b1a565b6040516115d1929190613a4a565b60405180910390208484848181106115eb576115eb613aad565b90506020028101906115fd9190614155565b61160b906020810190613409565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061164857611648613aad565b905060200281019061165a9190614155565b611668906060810190613b1a565b6040516116769291906141b4565b60405180910390a3505b600101611302565b6116906123dd565b73ffffffffffffffffffffffffffffffffffffffff81166116dd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61175c6123dd565b60085473ffffffffffffffffffffffffffffffffffffffff16156117bd576117bd61179c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006126a3565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561186a5761186a61182a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612825565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611901576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119116040820160208301613409565b61191e6040830183613b1a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061197592509050613a5a565b159050806119cb5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516119b691906141c8565b9081526040519081900360200190205460ff16155b15611a0457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109e19190613672565b6000611a136060850185613b1a565b810190611a2091906141da565b9050600081604001516001811115611a3a57611a3a6132fe565b03611a4d57611a4884612923565b611c10565b600181604001516001811115611a6557611a656132fe565b03611c10576000808260200151806020019051810190611a859190614286565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611acf9190613672565b6040516020818303038152906040528051906020012082604051602001611af69190613672565b6040516020818303038152906040528051906020012014611b43576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526009602052604090205460ff166002811115611b6857611b686132fe565b14611ba2576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505b50505050565b6001611c236005836123ca565b14611c5d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b611c688160006109f1565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cb090613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdc90613a5a565b8015611d295780601f10611cfe57610100808354040283529160200191611d29565b820191906000526020600020905b815481529060010190602001808311611d0c57829003601f168201915b50505050508152602001600382018054611d4290613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6e90613a5a565b8015611dbb5780601f10611d9057610100808354040283529160200191611dbb565b820191906000526020600020905b815481529060010190602001808311611d9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611de9565b50505050815250509050611e5181612c99565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ea990613a5a565b9050600003611ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f2090613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4c90613a5a565b8015611f995780601f10611f6e57610100808354040283529160200191611f99565b820191906000526020600020905b815481529060010190602001808311611f7c57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ffa90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461202690613a5a565b80156120735780601f1061204857610100808354040283529160200191612073565b820191906000526020600020905b81548152906001019060200180831161205657829003601f168201915b5050505050815250905060005b86518110156121d0576120f033308984815181106120a0576120a0613aad565b6020026020010151602001518a85815181106120be576120be613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d0b909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061212057612120613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121c85760025487516121c89173ffffffffffffffffffffffffffffffffffffffff169089908490811061217957612179613aad565b60200260200101516020015189848151811061219757612197613aad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126a39092919063ffffffff16565b600101612080565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded9061222a908b908690600401614307565b602060405180830381865afa158015612247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226b91906143d4565b60085490915073ffffffffffffffffffffffffffffffffffffffff16156122b1576008546122b19073ffffffffffffffffffffffffffffffffffffffff16333084612d0b565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156122e35760006122e5565b825b8a856040518463ffffffff1660e01b8152600401612304929190614307565b60206040518083038185885af1158015612322573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061234791906143d4565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6123be6123dd565b6123c781612d69565b50565b60006123d68383612e5e565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109e1565b565b804710156124ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109e1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612524576040519150601f19603f3d011682016040523d82523d6000602084013e612529565b606091505b50509050806112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612ee8565b600061269b848484612ff4565b949350505050565b80158061274357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561271d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274191906143d4565b155b6127cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161260c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561289c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c091906143d4565b6128ca91906143ed565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611c109085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161260c565b6040805160008082526020820190925281612960565b60408051808201909152600080825260208201528152602001906001900390816129395790505b50905060006040518060a001604052808480604001906129809190613b1a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612a019288359101614400565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612a71918901908901613409565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612aa190613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054612acd90613a5a565b8015612b1a5780601f10612aef57610100808354040283529160200191612b1a565b820191906000526020600020905b815481529060010190602001808311612afd57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612b576040870160208801613409565b846040518363ffffffff1660e01b8152600401612b75929190614307565b602060405180830381865afa158015612b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb691906143d4565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612bee576000612bf0565b835b612c006040890160208a01613409565b866040518463ffffffff1660e01b8152600401612c1e929190614307565b60206040518083038185885af1158015612c3c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c6191906143d4565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b612ca16123dd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612cdd9084906004016135ae565b600060405180830381600087803b158015612cf757600080fd5b505af11580156110e7573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611c109085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161260c565b3373ffffffffffffffffffffffffffffffffffffffff821603612de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109e1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612e825750612e828484613011565b6123d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109e1565b6000612f4a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661301d9092919063ffffffff16565b8051909150156112f25780806020019051810190612f689190614422565b6112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109e1565b6000828152600284016020526040812082905561269b848461302c565b60006123d68383613038565b606061269b8484600085613050565b60006123d68383613169565b600081815260018301602052604081205415156123d6565b6060824710156130e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161310b91906141c8565b60006040518083038185875af1925050503d8060008114613148576040519150601f19603f3d011682016040523d82523d6000602084013e61314d565b606091505b509150915061315e878383876131b8565b979650505050505050565b60008181526001830160205260408120546131b05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561068c565b50600061068c565b6060831561324e5782516000036132475773ffffffffffffffffffffffffffffffffffffffff85163b613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e1565b508161269b565b61269b83838151156132635781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e19190613672565b5080546132a390613a5a565b6000825580601f106132b3575050565b601f0160209004906000526020600020908101906123c791905b808211156132e157600081556001016132cd565b5090565b6000602082840312156132f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613368577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146123c757600080fd5b60008060006040848603121561339957600080fd5b83356133a48161336e565b9250602084013567ffffffffffffffff808211156133c157600080fd5b818601915086601f8301126133d557600080fd5b8135818111156133e457600080fd5b8760208285010111156133f657600080fd5b6020830194508093505050509250925092565b60006020828403121561341b57600080fd5b81356123d68161336e565b60005b83811015613441578181015183820152602001613429565b50506000910152565b60008151808452613462816020860160208601613426565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006134a7604083018561344a565b82810360208401526134b9818561344a565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146123c757600080fd5b600080604083850312156134f757600080fd5b8235613502816134c2565b946020939093013593505050565b60008060006060848603121561352557600080fd5b8335613530816134c2565b92506020840135613540816134c2565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156135a3578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613566565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135e860c084018261344a565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613624838361344a565b925060808601519150808584030160a0860152506134b98282613551565b6000806040838503121561365557600080fd5b823591506020830135613667816134c2565b809150509250929050565b6020815260006123d6602083018461344a565b60008083601f84011261369757600080fd5b50813567ffffffffffffffff8111156136af57600080fd5b6020830191508360208260051b85010111156136ca57600080fd5b9250929050565b600080600080604085870312156136e757600080fd5b843567ffffffffffffffff808211156136ff57600080fd5b61370b88838901613685565b9096509450602087013591508082111561372457600080fd5b5061373187828801613685565b95989497509550505050565b60006020828403121561374f57600080fd5b813567ffffffffffffffff81111561376657600080fd5b820160a081850312156123d657600080fd5b6000806020838503121561378b57600080fd5b823567ffffffffffffffff8111156137a257600080fd5b6137ae85828601613685565b90969095509350505050565b6000602082840312156137cc57600080fd5b81356123d6816134c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613829576138296137d7565b60405290565b6040516060810167ffffffffffffffff81118282101715613829576138296137d7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613899576138996137d7565b604052919050565b600067ffffffffffffffff8211156138bb576138bb6137d7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126138f857600080fd5b813561390b613906826138a1565b613852565b81815284602083860101111561392057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561395257600080fd5b833561395d8161336e565b925060208481013567ffffffffffffffff8082111561397b57600080fd5b818701915087601f83011261398f57600080fd5b8135818111156139a1576139a16137d7565b6139af848260051b01613852565b81815260069190911b8301840190848101908a8311156139ce57600080fd5b938501935b82851015613a1a576040858c0312156139ec5760008081fd5b6139f4613806565b85356139ff816134c2565b815285870135878201528252604090940193908501906139d3565b965050506040870135925080831115613a3257600080fd5b5050613a40868287016138e7565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a6e57607f821691505b602082108103613aa7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613b1057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b4f57600080fd5b83018035915067ffffffffffffffff821115613b6a57600080fd5b6020019150368190038213156136ca57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bb457600080fd5b830160208101925035905067ffffffffffffffff811115613bd457600080fd5b8036038213156136ca57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156135a3578135613c4f816134c2565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613c3c565b602081528135602082015260006020830135613c9c8161336e565b67ffffffffffffffff8082166040850152613cba6040860186613b7f565b925060a06060860152613cd160c086018483613be3565b925050613ce16060860186613b7f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613d17858385613be3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613d5057600080fd5b60209288019283019235915083821115613d6957600080fd5b8160061b3603831315613d7b57600080fd5b8685030160a087015261315e848284613c2c565b601f8211156112f2576000816000526020600020601f850160051c81016020861015613db85750805b601f850160051c820191505b81811015613dd757828155600101613dc4565b505050505050565b67ffffffffffffffff831115613df757613df76137d7565b613e0b83613e058354613a5a565b83613d8f565b6000601f841160018114613e5d5760008515613e275750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110e7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613eac5786850135825560209485019460019092019101613e8c565b5086821015613ee7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613f33816134c2565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613f9957613f996137d7565b8054838255808410156140265760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613fda57613fda613ef9565b8086168614613feb57613feb613ef9565b5060008360005260206000208360011b81018760011b820191505b80821015614021578282558284830155600282019150614006565b505050505b5060008181526020812083915b85811015613dd7576140458383613f28565b6040929092019160029190910190600101614033565b813581556001810160208301356140718161336e565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556140b16040860186613b1a565b935091506140c3838360028701613ddf565b6140d06060860186613b1a565b935091506140e2838360038701613ddf565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261411957600080fd5b91840191823591508082111561412e57600080fd5b506020820191508060061b360382131561414757600080fd5b611c10818360048601613f80565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613b1057600080fd5b80151581146123c757600080fd5b6000602082840312156141a957600080fd5b81356123d681614189565b60208152600061269b602083018486613be3565b60008251613b10818460208701613426565b6000602082840312156141ec57600080fd5b813567ffffffffffffffff8082111561420457600080fd5b908301906060828603121561421857600080fd5b61422061382f565b82358281111561422f57600080fd5b61423b878286016138e7565b82525060208301358281111561425057600080fd5b61425c878286016138e7565b602083015250604083013592506002831061427657600080fd5b6040810192909252509392505050565b6000806040838503121561429957600080fd5b825167ffffffffffffffff8111156142b057600080fd5b8301601f810185136142c157600080fd5b80516142cf613906826138a1565b8181528660208385010111156142e457600080fd5b6142f5826020830160208601613426565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a0604084015261433360e084018261344a565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261436f838361344a565b9250604086015191508085840301608086015261438c8383613551565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506143ca828261344a565b9695505050505050565b6000602082840312156143e657600080fd5b5051919050565b8082018082111561068c5761068c613ef9565b604081526000614413604083018561344a565b90508260208301529392505050565b60006020828403121561443457600080fd5b81516123d68161418956fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162004b8b38038062004b8b833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b6144ed806200069e6000396000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063c89245d514610448578063cf6730f814610468578063e4ca87541461048857600080fd5b80639fe74e26116100b05780639fe74e26146103dd578063b0f479a1146103fd578063c851cc321461042857600080fd5b806385572ffb146103715780638da5cb5b1461039157600080fd5b80635e35359e1161012d5780636fef519e116101075780636fef519e146102e657806379ba50971461033c5780638462a2b91461035157600080fd5b80635e35359e146102795780636939cd97146102995780636d62d633146102c657600080fd5b806335f170ef1161015e57806335f170ef146101fb5780635075a9d414610229578063536c6bfa1461025757600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a0366004613386565b60096020526000908152604090205460ff1681565b6040516101c291906133ce565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613425565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b6102163660046134aa565b610553565b6040516101c2929190613535565b34801561023557600080fd5b50610249610244366004613386565b61067f565b6040519081526020016101c2565b34801561026357600080fd5b50610277610272366004613585565b610692565b005b34801561028557600080fd5b506102776102943660046135b1565b6106f6565b3480156102a557600080fd5b506102b96102b4366004613386565b61078b565b6040516101c2919061364f565b3480156102d257600080fd5b506102776102e13660046136e3565b610996565b3480156102f257600080fd5b5061032f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c29190613713565b34801561034857600080fd5b50610277610cb0565b34801561035d57600080fd5b5061027761036c366004613772565b610dad565b34801561037d57600080fd5b5061027761038c3660046137de565b6110ee565b34801561039d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103e957600080fd5b506102776103f8366004613819565b6112f7565b34801561040957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103b8565b34801561043457600080fd5b5061027761044336600461385b565b611688565b34801561045457600080fd5b5061027761046336600461385b565b611754565b34801561047457600080fd5b506102776104833660046137de565b6118c8565b34801561049457600080fd5b506102776104a3366004613386565b611c16565b6102496104b63660046139de565b611e80565b3480156104c757600080fd5b506102776104d636600461385b565b612457565b3480156104e757600080fd5b506008546103b89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105379085908590613aeb565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061056e90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461059a90613afb565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b5050505050908060010180546105fc90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461062890613afb565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905082565b600061068c60058361246b565b92915050565b61069a61247e565b6106a48282612501565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6106fe61247e565b61071f73ffffffffffffffffffffffffffffffffffffffff8416838361265b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161077e91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107fa90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461082690613afb565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160038201805461088c90613afb565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890613afb565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109885760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610933565b505050915250909392505050565b61099e61247e565b60016109ab60058461246b565b146109ea576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109fa8260025b6005919061272f565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610a4290613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90613afb565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b50505050508152602001600382018054610ad490613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090613afb565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bd05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b7b565b5050505081525050905060005b816080015151811015610c5f57610c578383608001518381518110610c0457610c04613b4e565b60200260200101516020015184608001518481518110610c2657610c26613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661265b9092919063ffffffff16565b600101610bdd565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109e1565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610db561247e565b60005b81811015610f485760036000848484818110610dd657610dd6613b4e565b9050602002810190610de89190613b7d565b610df69060208101906134aa565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e2d57610e2d613b4e565b9050602002810190610e3f9190613b7d565b610e4d906020810190613bbb565b604051610e5b929190613aeb565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ea257610ea2613b4e565b9050602002810190610eb49190613b7d565b610ec2906020810190613bbb565b604051610ed0929190613aeb565b6040518091039020838383818110610eea57610eea613b4e565b9050602002810190610efc9190613b7d565b610f0a9060208101906134aa565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610db8565b5060005b838110156110e757600160036000878785818110610f6c57610f6c613b4e565b9050602002810190610f7e9190613b7d565b610f8c9060208101906134aa565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fc357610fc3613b4e565b9050602002810190610fd59190613b7d565b610fe3906020810190613bbb565b604051610ff1929190613aeb565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061104157611041613b4e565b90506020028101906110539190613b7d565b611061906020810190613bbb565b60405161106f929190613aeb565b604051809103902085858381811061108957611089613b4e565b905060200281019061109b9190613b7d565b6110a99060208101906134aa565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f4c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611141576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109e1565b61115160408201602083016134aa565b67ffffffffffffffff811660009081526003602052604090208054819061117790613afb565b90506000036111be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906111fa908690600401613d22565b600060405180830381600087803b15801561121457600080fd5b505af1925050508015611225575060015b6112c5573d808015611253576040519150601f19603f3d011682016040523d82523d6000602084013e611258565b606091505b50611265843560016109f1565b5083356000908152600460205260409020849061128282826140fc565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112b7908490613713565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6112ff61247e565b60005b818110156112f25782828281811061131c5761131c613b4e565b905060200281019061132e91906141f6565b61133f906040810190602001614238565b61140b576003600084848481811061135957611359613b4e565b905060200281019061136b91906141f6565b6113799060208101906134aa565b67ffffffffffffffff1681526020810191909152604001600090812061139e91613338565b8282828181106113b0576113b0613b4e565b90506020028101906113c291906141f6565b6113d09060208101906134aa565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611680565b82828281811061141d5761141d613b4e565b905060200281019061142f91906141f6565b61143d906040810190613bbb565b9050600003611478576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061149057611490613b4e565b90506020028101906114a291906141f6565b6114b09060208101906134aa565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106114e6576114e6613b4e565b90506020028101906114f891906141f6565b611506906040810190613bbb565b8291611513919083613e80565b5083838381811061152657611526613b4e565b905060200281019061153891906141f6565b611546906060810190613bbb565b1590506115915783838381811061155f5761155f613b4e565b905060200281019061157191906141f6565b61157f906060810190613bbb565b600183019161158f919083613e80565b505b8383838181106115a3576115a3613b4e565b90506020028101906115b591906141f6565b6115c3906040810190613bbb565b6040516115d1929190613aeb565b60405180910390208484848181106115eb576115eb613b4e565b90506020028101906115fd91906141f6565b61160b9060208101906134aa565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061164857611648613b4e565b905060200281019061165a91906141f6565b611668906060810190613bbb565b604051611676929190614255565b60405180910390a3505b600101611302565b61169061247e565b73ffffffffffffffffffffffffffffffffffffffff81166116dd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61175c61247e565b60085473ffffffffffffffffffffffffffffffffffffffff16156117bd576117bd61179c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612744565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561186a5761186a61182a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128c6565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611901576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61191160408201602083016134aa565b61191e6040830183613bbb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061197592509050613afb565b159050806119cb5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516119b69190614269565b9081526040519081900360200190205460ff16155b15611a0457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109e19190613713565b6000611a136060850185613bbb565b810190611a20919061427b565b9050600081604001516001811115611a3a57611a3a61339f565b03611a4d57611a48846129c4565b611c10565b600181604001516001811115611a6557611a6561339f565b03611c10576000808260200151806020019051810190611a859190614327565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611acf9190613713565b6040516020818303038152906040528051906020012082604051602001611af69190613713565b6040516020818303038152906040528051906020012014611b43576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526009602052604090205460ff166002811115611b6857611b6861339f565b14611ba2576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505b50505050565b6001611c2360058361246b565b14611c5d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b611c688160006109f1565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cb090613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdc90613afb565b8015611d295780601f10611cfe57610100808354040283529160200191611d29565b820191906000526020600020905b815481529060010190602001808311611d0c57829003601f168201915b50505050508152602001600382018054611d4290613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6e90613afb565b8015611dbb5780601f10611d9057610100808354040283529160200191611dbb565b820191906000526020600020905b815481529060010190602001808311611d9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611de9565b50505050815250509050611e5181612d3a565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ea990613afb565b9050600003611ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f2090613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4c90613afb565b8015611f995780601f10611f6e57610100808354040283529160200191611f99565b820191906000526020600020905b815481529060010190602001808311611f7c57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ffa90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461202690613afb565b80156120735780601f1061204857610100808354040283529160200191612073565b820191906000526020600020905b81548152906001019060200180831161205657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906120da908b9086906004016143a8565b602060405180830381865afa1580156120f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211b9190614475565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906121d457506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156121ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d29190614475565b105b156121fe576008546121fe9073ffffffffffffffffffffffffffffffffffffffff16333084612dac565b60005b87518110156123515761227133308a848151811061222157612221613b4e565b6020026020010151602001518b858151811061223f5761223f613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dac909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106122a1576122a1613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146123495760025488516123499173ffffffffffffffffffffffffffffffffffffffff16908a90849081106122fa576122fa613b4e565b6020026020010151602001518a848151811061231857612318613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127449092919063ffffffff16565b600101612201565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612384576000612386565b825b8a856040518463ffffffff1660e01b81526004016123a59291906143a8565b60206040518083038185885af11580156123c3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123e89190614475565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61245f61247e565b61246881612e0a565b50565b60006124778383612eff565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109e1565b565b8047101561256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109e1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146125c5576040519150601f19603f3d011682016040523d82523d6000602084013e6125ca565b606091505b50509050806112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f89565b600061273c848484613095565b949350505050565b8015806127e457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e29190614475565b155b612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016126ad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561293d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129619190614475565b61296b919061448e565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611c109085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016126ad565b6040805160008082526020820190925281612a01565b60408051808201909152600080825260208201528152602001906001900390816129da5790505b50905060006040518060a00160405280848060400190612a219190613bbb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612aa292883591016144a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612b129189019089016134aa565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612b4290613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054612b6e90613afb565b8015612bbb5780601f10612b9057610100808354040283529160200191612bbb565b820191906000526020600020905b815481529060010190602001808311612b9e57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612bf860408701602088016134aa565b846040518363ffffffff1660e01b8152600401612c169291906143a8565b602060405180830381865afa158015612c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c579190614475565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612c8f576000612c91565b835b612ca16040890160208a016134aa565b866040518463ffffffff1660e01b8152600401612cbf9291906143a8565b60206040518083038185885af1158015612cdd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d029190614475565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b612d4261247e565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612d7e90849060040161364f565b600060405180830381600087803b158015612d9857600080fd5b505af11580156110e7573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611c109085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016126ad565b3373ffffffffffffffffffffffffffffffffffffffff821603612e89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109e1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612f235750612f2384846130b2565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109e1565b6000612feb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130be9092919063ffffffff16565b8051909150156112f2578080602001905181019061300991906144c3565b6112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109e1565b6000828152600284016020526040812082905561273c84846130cd565b600061247783836130d9565b606061273c84846000856130f1565b6000612477838361320a565b60008181526001830160205260408120541515612477565b606082471015613183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ac9190614269565b60006040518083038185875af1925050503d80600081146131e9576040519150601f19603f3d011682016040523d82523d6000602084013e6131ee565b606091505b50915091506131ff87838387613259565b979650505050505050565b60008181526001830160205260408120546132515750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561068c565b50600061068c565b606083156132ef5782516000036132e85773ffffffffffffffffffffffffffffffffffffffff85163b6132e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e1565b508161273c565b61273c83838151156133045781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e19190613713565b50805461334490613afb565b6000825580601f10613354575050565b601f01602090049060005260206000209081019061246891905b80821115613382576000815560010161336e565b5090565b60006020828403121561339857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613409577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461246857600080fd5b60008060006040848603121561343a57600080fd5b83356134458161340f565b9250602084013567ffffffffffffffff8082111561346257600080fd5b818601915086601f83011261347657600080fd5b81358181111561348557600080fd5b87602082850101111561349757600080fd5b6020830194508093505050509250925092565b6000602082840312156134bc57600080fd5b81356124778161340f565b60005b838110156134e25781810151838201526020016134ca565b50506000910152565b600081518084526135038160208601602086016134c7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061354860408301856134eb565b828103602084015261355a81856134eb565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461246857600080fd5b6000806040838503121561359857600080fd5b82356135a381613563565b946020939093013593505050565b6000806000606084860312156135c657600080fd5b83356135d181613563565b925060208401356135e181613563565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613644578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613607565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261368960c08401826134eb565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136c583836134eb565b925060808601519150808584030160a08601525061355a82826135f2565b600080604083850312156136f657600080fd5b82359150602083013561370881613563565b809150509250929050565b60208152600061247760208301846134eb565b60008083601f84011261373857600080fd5b50813567ffffffffffffffff81111561375057600080fd5b6020830191508360208260051b850101111561376b57600080fd5b9250929050565b6000806000806040858703121561378857600080fd5b843567ffffffffffffffff808211156137a057600080fd5b6137ac88838901613726565b909650945060208701359150808211156137c557600080fd5b506137d287828801613726565b95989497509550505050565b6000602082840312156137f057600080fd5b813567ffffffffffffffff81111561380757600080fd5b820160a0818503121561247757600080fd5b6000806020838503121561382c57600080fd5b823567ffffffffffffffff81111561384357600080fd5b61384f85828601613726565b90969095509350505050565b60006020828403121561386d57600080fd5b813561247781613563565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156138ca576138ca613878565b60405290565b6040516060810167ffffffffffffffff811182821017156138ca576138ca613878565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561393a5761393a613878565b604052919050565b600067ffffffffffffffff82111561395c5761395c613878565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261399957600080fd5b81356139ac6139a782613942565b6138f3565b8181528460208386010111156139c157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156139f357600080fd5b83356139fe8161340f565b925060208481013567ffffffffffffffff80821115613a1c57600080fd5b818701915087601f830112613a3057600080fd5b813581811115613a4257613a42613878565b613a50848260051b016138f3565b81815260069190911b8301840190848101908a831115613a6f57600080fd5b938501935b82851015613abb576040858c031215613a8d5760008081fd5b613a956138a7565b8535613aa081613563565b81528587013587820152825260409094019390850190613a74565b965050506040870135925080831115613ad357600080fd5b5050613ae186828701613988565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b0f57607f821691505b602082108103613b48577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613bb157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bf057600080fd5b83018035915067ffffffffffffffff821115613c0b57600080fd5b60200191503681900382131561376b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5557600080fd5b830160208101925035905067ffffffffffffffff811115613c7557600080fd5b80360382131561376b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613644578135613cf081613563565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613cdd565b602081528135602082015260006020830135613d3d8161340f565b67ffffffffffffffff8082166040850152613d5b6040860186613c20565b925060a06060860152613d7260c086018483613c84565b925050613d826060860186613c20565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613db8858385613c84565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613df157600080fd5b60209288019283019235915083821115613e0a57600080fd5b8160061b3603831315613e1c57600080fd5b8685030160a08701526131ff848284613ccd565b601f8211156112f2576000816000526020600020601f850160051c81016020861015613e595750805b601f850160051c820191505b81811015613e7857828155600101613e65565b505050505050565b67ffffffffffffffff831115613e9857613e98613878565b613eac83613ea68354613afb565b83613e30565b6000601f841160018114613efe5760008515613ec85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110e7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f4d5786850135825560209485019460019092019101613f2d565b5086821015613f88577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613fd481613563565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561403a5761403a613878565b8054838255808410156140c75760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461407b5761407b613f9a565b808616861461408c5761408c613f9a565b5060008360005260206000208360011b81018760011b820191505b808210156140c25782825582848301556002820191506140a7565b505050505b5060008181526020812083915b85811015613e78576140e68383613fc9565b60409290920191600291909101906001016140d4565b813581556001810160208301356141128161340f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141526040860186613bbb565b93509150614164838360028701613e80565b6141716060860186613bbb565b93509150614183838360038701613e80565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126141ba57600080fd5b9184019182359150808211156141cf57600080fd5b506020820191508060061b36038213156141e857600080fd5b611c10818360048601614021565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613bb157600080fd5b801515811461246857600080fd5b60006020828403121561424a57600080fd5b81356124778161422a565b60208152600061273c602083018486613c84565b60008251613bb18184602087016134c7565b60006020828403121561428d57600080fd5b813567ffffffffffffffff808211156142a557600080fd5b90830190606082860312156142b957600080fd5b6142c16138d0565b8235828111156142d057600080fd5b6142dc87828601613988565b8252506020830135828111156142f157600080fd5b6142fd87828601613988565b602083015250604083013592506002831061431757600080fd5b6040810192909252509392505050565b6000806040838503121561433a57600080fd5b825167ffffffffffffffff81111561435157600080fd5b8301601f8101851361436257600080fd5b80516143706139a782613942565b81815286602083850101111561438557600080fd5b6143968260208301602086016134c7565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a060408401526143d460e08401826134eb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261441083836134eb565b9250604086015191508085840301608086015261442d83836135f2565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061446b82826134eb565b9695505050505050565b60006020828403121561448757600080fd5b5051919050565b8082018082111561068c5761068c613f9a565b6040815260006144b460408301856134eb565b90508260208301529392505050565b6000602082840312156144d557600080fd5b81516124778161422a56fea164736f6c6343000818000a", } var CCIPClientWithACKABI = CCIPClientWithACKMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index c0d5b71cc9..6735d0479c 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 @@ -57,7 +57,7 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bda38038062004bda8339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b61451080620006ca6000396000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063e4ca875411610064578063e4ca8754146105c5578063e89b4485146105e5578063f2fde38b146105f8578063ff2deec31461061857600080fd5b8063bee518a41461051a578063c851cc3214610565578063c89245d514610585578063cf6730f8146105a557600080fd5b80639fe74e26116100d15780639fe74e261461047f578063b0f479a11461049f578063b187bd26146104ca578063b5a11011146104fa57600080fd5b806385572ffb146104145780638da5cb5b146104345780639d2aede51461045f57600080fd5b80635075a9d4116101645780636939cd971161013e5780636939cd97146103925780636d62d633146103bf57806379ba5097146103df5780638462a2b9146103f457600080fd5b80635075a9d414610324578063536c6bfa146103525780635e35359e1461037257600080fd5b80631892b906116101a05780631892b906146102755780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630e958d6b146101d257806316c38b3c14610207578063181f5a771461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed36600461346f565b610645565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004613502565b610690565b005b34801561023557600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e332e300000000000000000000000000000602082015290516101fe919061358d565b34801561028157600080fd5b506102276102903660046135a0565b6106e2565b3480156102a157600080fd5b5061022761073d565b3480156102b657600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b506103166103113660046135a0565b610779565b6040516101fe9291906135bd565b34801561033057600080fd5b5061034461033f3660046135eb565b6108a5565b6040519081526020016101fe565b34801561035e57600080fd5b5061022761036d366004613626565b6108b8565b34801561037e57600080fd5b5061022761038d366004613652565b61091c565b34801561039e57600080fd5b506103b26103ad3660046135eb565b6109b1565b6040516101fe91906136f0565b3480156103cb57600080fd5b506102276103da366004613784565b610bbc565b3480156103eb57600080fd5b50610227610ed6565b34801561040057600080fd5b5061022761040f366004613800565b610fd3565b34801561042057600080fd5b5061022761042f36600461386c565b611314565b34801561044057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561046b57600080fd5b5061022761047a3660046138a7565b61151d565b34801561048b57600080fd5b5061022761049a3660046138c4565b6115e2565b3480156104ab57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104d657600080fd5b5060095474010000000000000000000000000000000000000000900460ff166101f2565b34801561050657600080fd5b50610227610515366004613906565b611973565b34801561052657600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561057157600080fd5b506102276105803660046138a7565b611b19565b34801561059157600080fd5b506102276105a03660046138a7565b611be5565b3480156105b157600080fd5b506102276105c036600461386c565b611d4f565b3480156105d157600080fd5b506102276105e03660046135eb565b611f64565b6103446105f3366004613a69565b6121ce565b34801561060457600080fd5b506102276106133660046138a7565b612778565b34801561062457600080fd5b506008546102d19073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106749085908590613b76565b9081526040519081900360200190205460ff1690509392505050565b61069861278c565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106ea61278c565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61074561278c565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055610777600161280d565b565b60036020526000908152604090208054819061079490613b86565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090613b86565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509080600101805461082290613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613b86565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905082565b60006108b2600583612931565b92915050565b6108c061278c565b6108ca8282612944565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61092461278c565b61094573ffffffffffffffffffffffffffffffffffffffff84168383612a9e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a2090613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90613b86565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b86565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b59565b505050915250909392505050565b610bc461278c565b6001610bd1600584612931565b14610c10576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c208260025b60059190612b72565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c6890613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9490613b86565b8015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b50505050508152602001600382018054610cfa90613b86565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690613b86565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610df65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610da1565b5050505081525050905060005b816080015151811015610e8557610e7d8383608001518381518110610e2a57610e2a613bd9565b60200260200101516020015184608001518481518110610e4c57610e4c613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a9e9092919063ffffffff16565b600101610e03565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c07565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fdb61278c565b60005b8181101561116e5760036000848484818110610ffc57610ffc613bd9565b905060200281019061100e9190613c08565b61101c9060208101906135a0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061105357611053613bd9565b90506020028101906110659190613c08565b611073906020810190613c46565b604051611081929190613b76565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110c8576110c8613bd9565b90506020028101906110da9190613c08565b6110e8906020810190613c46565b6040516110f6929190613b76565b604051809103902083838381811061111057611110613bd9565b90506020028101906111229190613c08565b6111309060208101906135a0565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610fde565b5060005b8381101561130d5760016003600087878581811061119257611192613bd9565b90506020028101906111a49190613c08565b6111b29060208101906135a0565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106111e9576111e9613bd9565b90506020028101906111fb9190613c08565b611209906020810190613c46565b604051611217929190613b76565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061126757611267613bd9565b90506020028101906112799190613c08565b611287906020810190613c46565b604051611295929190613b76565b60405180910390208585838181106112af576112af613bd9565b90506020028101906112c19190613c08565b6112cf9060208101906135a0565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611172565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611367576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c07565b61137760408201602083016135a0565b67ffffffffffffffff811660009081526003602052604090208054819061139d90613b86565b90506000036113e4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611420908690600401613dad565b600060405180830381600087803b15801561143a57600080fd5b505af192505050801561144b575060015b6114eb573d808015611479576040519150601f19603f3d011682016040523d82523d6000602084013e61147e565b606091505b5061148b84356001610c17565b508335600090815260046020526040902084906114a8828261417f565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906114dd90849061358d565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61152561278c565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906115de9082614279565b5050565b6115ea61278c565b60005b818110156115185782828281811061160757611607613bd9565b90506020028101906116199190614393565b61162a906040810190602001613502565b6116f6576003600084848481811061164457611644613bd9565b90506020028101906116569190614393565b6116649060208101906135a0565b67ffffffffffffffff168152602081019190915260400160009081206116899161340b565b82828281811061169b5761169b613bd9565b90506020028101906116ad9190614393565b6116bb9060208101906135a0565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261196b565b82828281811061170857611708613bd9565b905060200281019061171a9190614393565b611728906040810190613c46565b9050600003611763576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061177b5761177b613bd9565b905060200281019061178d9190614393565b61179b9060208101906135a0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106117d1576117d1613bd9565b90506020028101906117e39190614393565b6117f1906040810190613c46565b82916117fe919083613f03565b5083838381811061181157611811613bd9565b90506020028101906118239190614393565b611831906060810190613c46565b15905061187c5783838381811061184a5761184a613bd9565b905060200281019061185c9190614393565b61186a906060810190613c46565b600183019161187a919083613f03565b505b83838381811061188e5761188e613bd9565b90506020028101906118a09190614393565b6118ae906040810190613c46565b6040516118bc929190613b76565b60405180910390208484848181106118d6576118d6613bd9565b90506020028101906118e89190614393565b6118f69060208101906135a0565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061193357611933613bd9565b90506020028101906119459190614393565b611953906060810190613c46565b6040516119619291906143c7565b60405180910390a3505b6001016115ed565b61197b61278c565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a6c916143db565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115189082614279565b611b2161278c565b73ffffffffffffffffffffffffffffffffffffffff8116611b6e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611bed61278c565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c4e57611c4e611c2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b87565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611cfb57611cfb611cbb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612d09565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611d88576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d9860408201602083016135a0565b611da56040830183613c46565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611dfc92509050613b86565b15905080611e525750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e3d91906143db565b9081526040519081900360200190205460ff16155b15611e8b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c07919061358d565b611e9b60408401602085016135a0565b67ffffffffffffffff8116600090815260036020526040902080548190611ec190613b86565b9050600003611f08576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6000611f176060870187613c46565b810190611f2491906135eb565b60095490915074010000000000000000000000000000000000000000900460ff16611f5c57611f5c611f578260016143ed565b61280d565b505050505050565b6001611f71600583612931565b14611fab576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c07565b611fb6816000610c17565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611ffe90613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90613b86565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b5050505050815260200160038201805461209090613b86565b80601f01602080910402602001604051908101604052809291908181526020018280546120bc90613b86565b80156121095780601f106120de57610100808354040283529160200191612109565b820191906000526020600020905b8154815290600101906020018083116120ec57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561218c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612137565b5050505081525050905061219f81612e0d565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906121f790613b86565b905060000361223e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061226e90613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461229a90613b86565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161234890613b86565b80601f016020809104026020016040519081016040528092919081815260200182805461237490613b86565b80156123c15780601f10612396576101008083540402835291602001916123c1565b820191906000526020600020905b8154815290600101906020018083116123a457829003601f168201915b5050505050815250905060005b865181101561251e5761243e33308984815181106123ee576123ee613bd9565b6020026020010151602001518a858151811061240c5761240c613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e7f909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061246e5761246e613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146125165760025487516125169173ffffffffffffffffffffffffffffffffffffffff16908990849081106124c7576124c7613bd9565b6020026020010151602001518984815181106124e5576124e5613bd9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b879092919063ffffffff16565b6001016123ce565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90612578908b908690600401614400565b602060405180830381865afa158015612595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b991906144cd565b60085490915073ffffffffffffffffffffffffffffffffffffffff161580159061267257506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561264c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267091906144cd565b105b1561269c5760085461269c9073ffffffffffffffffffffffffffffffffffffffff16333084612e7f565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156126ce5760006126d0565b825b8a856040518463ffffffff1660e01b81526004016126ef929190614400565b60206040518083038185885af115801561270d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061273291906144cd565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161276591815260200190565b60405180910390a1505050509392505050565b61278061278c565b61278981612edd565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c07565b80600116600103612850576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612884565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161289991815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600854600080855260208501909352909350611518927401000000000000000000000000000000000000000090910467ffffffffffffffff169161292a565b60408051808201909152600080825260208201528152602001906001900390816129035790505b50836121ce565b600061293d8383612fd2565b9392505050565b804710156129ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c07565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a08576040519150601f19603f3d011682016040523d82523d6000602084013e612a0d565b606091505b5050905080611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261305c565b6000612b7f848484613168565b949350505050565b801580612c2757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2591906144cd565b155b612cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da491906144cd565b612dae91906143ed565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612e079085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af0565b50505050565b612e1561278c565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e519084906004016136f0565b600060405180830381600087803b158015612e6b57600080fd5b505af115801561130d573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e079085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612af0565b3373ffffffffffffffffffffffffffffffffffffffff821603612f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c07565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612ff65750612ff68484613185565b61293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c07565b60006130be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131919092919063ffffffff16565b80519091501561151857808060200190518101906130dc91906144e6565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c07565b60008281526002840160205260408120829055612b7f84846131a0565b600061293d83836131ac565b6060612b7f84846000856131c4565b600061293d83836132dd565b6000818152600183016020526040812054151561293d565b606082471015613256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c07565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161327f91906143db565b60006040518083038185875af1925050503d80600081146132bc576040519150601f19603f3d011682016040523d82523d6000602084013e6132c1565b606091505b50915091506132d28783838761332c565b979650505050505050565b6000818152600183016020526040812054613324575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b2565b5060006108b2565b606083156133c25782516000036133bb5773ffffffffffffffffffffffffffffffffffffffff85163b6133bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c07565b5081612b7f565b612b7f83838151156133d75781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07919061358d565b50805461341790613b86565b6000825580601f10613427575050565b601f01602090049060005260206000209081019061278991905b808211156134555760008155600101613441565b5090565b67ffffffffffffffff8116811461278957600080fd5b60008060006040848603121561348457600080fd5b833561348f81613459565b9250602084013567ffffffffffffffff808211156134ac57600080fd5b818601915086601f8301126134c057600080fd5b8135818111156134cf57600080fd5b8760208285010111156134e157600080fd5b6020830194508093505050509250925092565b801515811461278957600080fd5b60006020828403121561351457600080fd5b813561293d816134f4565b60005b8381101561353a578181015183820152602001613522565b50506000910152565b6000815180845261355b81602086016020860161351f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061293d6020830184613543565b6000602082840312156135b257600080fd5b813561293d81613459565b6040815260006135d06040830185613543565b82810360208401526135e28185613543565b95945050505050565b6000602082840312156135fd57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461278957600080fd5b6000806040838503121561363957600080fd5b823561364481613604565b946020939093013593505050565b60008060006060848603121561366757600080fd5b833561367281613604565b9250602084013561368281613604565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136e5578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136a8565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261372a60c0840182613543565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137668383613543565b925060808601519150808584030160a0860152506135e28282613693565b6000806040838503121561379757600080fd5b8235915060208301356137a981613604565b809150509250929050565b60008083601f8401126137c657600080fd5b50813567ffffffffffffffff8111156137de57600080fd5b6020830191508360208260051b85010111156137f957600080fd5b9250929050565b6000806000806040858703121561381657600080fd5b843567ffffffffffffffff8082111561382e57600080fd5b61383a888389016137b4565b9096509450602087013591508082111561385357600080fd5b50613860878288016137b4565b95989497509550505050565b60006020828403121561387e57600080fd5b813567ffffffffffffffff81111561389557600080fd5b820160a0818503121561293d57600080fd5b6000602082840312156138b957600080fd5b813561293d81613604565b600080602083850312156138d757600080fd5b823567ffffffffffffffff8111156138ee57600080fd5b6138fa858286016137b4565b90969095509350505050565b6000806040838503121561391957600080fd5b823561392481613459565b915060208301356137a981613604565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561398657613986613934565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139d3576139d3613934565b604052919050565b600082601f8301126139ec57600080fd5b813567ffffffffffffffff811115613a0657613a06613934565b613a3760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161398c565b818152846020838601011115613a4c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a7e57600080fd5b8335613a8981613459565b925060208481013567ffffffffffffffff80821115613aa757600080fd5b818701915087601f830112613abb57600080fd5b813581811115613acd57613acd613934565b613adb848260051b0161398c565b81815260069190911b8301840190848101908a831115613afa57600080fd5b938501935b82851015613b46576040858c031215613b185760008081fd5b613b20613963565b8535613b2b81613604565b81528587013587820152825260409094019390850190613aff565b965050506040870135925080831115613b5e57600080fd5b5050613b6c868287016139db565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b9a57607f821691505b602082108103613bd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c3c57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c7b57600080fd5b83018035915067ffffffffffffffff821115613c9657600080fd5b6020019150368190038213156137f957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ce057600080fd5b830160208101925035905067ffffffffffffffff811115613d0057600080fd5b8036038213156137f957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136e5578135613d7b81613604565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d68565b602081528135602082015260006020830135613dc881613459565b67ffffffffffffffff8082166040850152613de66040860186613cab565b925060a06060860152613dfd60c086018483613d0f565b925050613e0d6060860186613cab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e43858385613d0f565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e7c57600080fd5b60209288019283019235915083821115613e9557600080fd5b8160061b3603831315613ea757600080fd5b8685030160a08701526132d2848284613d58565b601f821115611518576000816000526020600020601f850160051c81016020861015613ee45750805b601f850160051c820191505b81811015611f5c57828155600101613ef0565b67ffffffffffffffff831115613f1b57613f1b613934565b613f2f83613f298354613b86565b83613ebb565b6000601f841160018114613f815760008515613f4b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561130d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fd05786850135825560209485019460019092019101613fb0565b508682101561400b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561405781613604565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140bd576140bd613934565b80548382558084101561414a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146140fe576140fe61401d565b808616861461410f5761410f61401d565b5060008360005260206000208360011b81018760011b820191505b8082101561414557828255828483015560028201915061412a565b505050505b5060008181526020812083915b85811015611f5c57614169838361404c565b6040929092019160029190910190600101614157565b8135815560018101602083013561419581613459565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141d56040860186613c46565b935091506141e7838360028701613f03565b6141f46060860186613c46565b93509150614206838360038701613f03565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261423d57600080fd5b91840191823591508082111561425257600080fd5b506020820191508060061b360382131561426b57600080fd5b612e078183600486016140a4565b815167ffffffffffffffff81111561429357614293613934565b6142a7816142a18454613b86565b84613ebb565b602080601f8311600181146142fa57600084156142c45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f5c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561434757888601518255948401946001909101908401614328565b508582101561438357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c3c57600080fd5b602081526000612b7f602083018486613d0f565b60008251613c3c81846020870161351f565b808201808211156108b2576108b261401d565b67ffffffffffffffff83168152604060208201526000825160a0604084015261442c60e0840182613543565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144688383613543565b925060408601519150808584030160808601526144858383613693565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144c38282613543565b9695505050505050565b6000602082840312156144df57600080fd5b5051919050565b6000602082840312156144f857600080fd5b815161293d816134f456fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162004bde38038062004bde8339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b61451480620006ca6000396000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063e4ca875411610064578063e4ca8754146105c5578063e89b4485146105e5578063f2fde38b146105f8578063ff2deec31461061857600080fd5b8063bee518a41461051a578063c851cc3214610565578063c89245d514610585578063cf6730f8146105a557600080fd5b80639fe74e26116100d15780639fe74e261461047f578063b0f479a11461049f578063b187bd26146104ca578063b5a11011146104fa57600080fd5b806385572ffb146104145780638da5cb5b146104345780639d2aede51461045f57600080fd5b80635075a9d4116101645780636939cd971161013e5780636939cd97146103925780636d62d633146103bf57806379ba5097146103df5780638462a2b9146103f457600080fd5b80635075a9d414610324578063536c6bfa146103525780635e35359e1461037257600080fd5b80631892b906116101a05780631892b906146102755780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630e958d6b146101d257806316c38b3c14610207578063181f5a771461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004613473565b610645565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004613506565b610690565b005b34801561023557600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e332e300000000000000000000000000000602082015290516101fe9190613591565b34801561028157600080fd5b506102276102903660046135a4565b6106e2565b3480156102a157600080fd5b5061022761073d565b3480156102b657600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b506103166103113660046135a4565b610779565b6040516101fe9291906135c1565b34801561033057600080fd5b5061034461033f3660046135ef565b6108a5565b6040519081526020016101fe565b34801561035e57600080fd5b5061022761036d36600461362a565b6108b8565b34801561037e57600080fd5b5061022761038d366004613656565b61091c565b34801561039e57600080fd5b506103b26103ad3660046135ef565b6109b1565b6040516101fe91906136f4565b3480156103cb57600080fd5b506102276103da366004613788565b610bbc565b3480156103eb57600080fd5b50610227610ed6565b34801561040057600080fd5b5061022761040f366004613804565b610fd3565b34801561042057600080fd5b5061022761042f366004613870565b611314565b34801561044057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561046b57600080fd5b5061022761047a3660046138ab565b61151d565b34801561048b57600080fd5b5061022761049a3660046138c8565b6115e2565b3480156104ab57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104d657600080fd5b5060095474010000000000000000000000000000000000000000900460ff166101f2565b34801561050657600080fd5b5061022761051536600461390a565b611973565b34801561052657600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561057157600080fd5b506102276105803660046138ab565b611b19565b34801561059157600080fd5b506102276105a03660046138ab565b611be5565b3480156105b157600080fd5b506102276105c0366004613870565b611d4f565b3480156105d157600080fd5b506102276105e03660046135ef565b611f64565b6103446105f3366004613a6d565b6121ce565b34801561060457600080fd5b506102276106133660046138ab565b61277c565b34801561062457600080fd5b506008546102d19073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106749085908590613b7a565b9081526040519081900360200190205460ff1690509392505050565b610698612790565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106ea612790565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610745612790565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107776001612811565b565b60036020526000908152604090208054819061079490613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090613b8a565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509080600101805461082290613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613b8a565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905082565b60006108b2600583612935565b92915050565b6108c0612790565b6108ca8282612948565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610924612790565b61094573ffffffffffffffffffffffffffffffffffffffff84168383612aa2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a2090613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90613b8a565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b8a565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b59565b505050915250909392505050565b610bc4612790565b6001610bd1600584612935565b14610c10576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c208260025b60059190612b76565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c6890613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9490613b8a565b8015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b50505050508152602001600382018054610cfa90613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690613b8a565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610df65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610da1565b5050505081525050905060005b816080015151811015610e8557610e7d8383608001518381518110610e2a57610e2a613bdd565b60200260200101516020015184608001518481518110610e4c57610e4c613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612aa29092919063ffffffff16565b600101610e03565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c07565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fdb612790565b60005b8181101561116e5760036000848484818110610ffc57610ffc613bdd565b905060200281019061100e9190613c0c565b61101c9060208101906135a4565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061105357611053613bdd565b90506020028101906110659190613c0c565b611073906020810190613c4a565b604051611081929190613b7a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110c8576110c8613bdd565b90506020028101906110da9190613c0c565b6110e8906020810190613c4a565b6040516110f6929190613b7a565b604051809103902083838381811061111057611110613bdd565b90506020028101906111229190613c0c565b6111309060208101906135a4565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610fde565b5060005b8381101561130d5760016003600087878581811061119257611192613bdd565b90506020028101906111a49190613c0c565b6111b29060208101906135a4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106111e9576111e9613bdd565b90506020028101906111fb9190613c0c565b611209906020810190613c4a565b604051611217929190613b7a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061126757611267613bdd565b90506020028101906112799190613c0c565b611287906020810190613c4a565b604051611295929190613b7a565b60405180910390208585838181106112af576112af613bdd565b90506020028101906112c19190613c0c565b6112cf9060208101906135a4565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611172565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611367576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c07565b61137760408201602083016135a4565b67ffffffffffffffff811660009081526003602052604090208054819061139d90613b8a565b90506000036113e4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611420908690600401613db1565b600060405180830381600087803b15801561143a57600080fd5b505af192505050801561144b575060015b6114eb573d808015611479576040519150601f19603f3d011682016040523d82523d6000602084013e61147e565b606091505b5061148b84356001610c17565b508335600090815260046020526040902084906114a88282614183565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906114dd908490613591565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611525612790565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906115de908261427d565b5050565b6115ea612790565b60005b818110156115185782828281811061160757611607613bdd565b90506020028101906116199190614397565b61162a906040810190602001613506565b6116f6576003600084848481811061164457611644613bdd565b90506020028101906116569190614397565b6116649060208101906135a4565b67ffffffffffffffff168152602081019190915260400160009081206116899161340f565b82828281811061169b5761169b613bdd565b90506020028101906116ad9190614397565b6116bb9060208101906135a4565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261196b565b82828281811061170857611708613bdd565b905060200281019061171a9190614397565b611728906040810190613c4a565b9050600003611763576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061177b5761177b613bdd565b905060200281019061178d9190614397565b61179b9060208101906135a4565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106117d1576117d1613bdd565b90506020028101906117e39190614397565b6117f1906040810190613c4a565b82916117fe919083613f07565b5083838381811061181157611811613bdd565b90506020028101906118239190614397565b611831906060810190613c4a565b15905061187c5783838381811061184a5761184a613bdd565b905060200281019061185c9190614397565b61186a906060810190613c4a565b600183019161187a919083613f07565b505b83838381811061188e5761188e613bdd565b90506020028101906118a09190614397565b6118ae906040810190613c4a565b6040516118bc929190613b7a565b60405180910390208484848181106118d6576118d6613bdd565b90506020028101906118e89190614397565b6118f69060208101906135a4565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061193357611933613bdd565b90506020028101906119459190614397565b611953906060810190613c4a565b6040516119619291906143cb565b60405180910390a3505b6001016115ed565b61197b612790565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a6c916143df565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611518908261427d565b611b21612790565b73ffffffffffffffffffffffffffffffffffffffff8116611b6e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611bed612790565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c4e57611c4e611c2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b8b565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611cfb57611cfb611cbb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612d0d565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611d88576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d9860408201602083016135a4565b611da56040830183613c4a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611dfc92509050613b8a565b15905080611e525750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e3d91906143df565b9081526040519081900360200190205460ff16155b15611e8b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c079190613591565b611e9b60408401602085016135a4565b67ffffffffffffffff8116600090815260036020526040902080548190611ec190613b8a565b9050600003611f08576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6000611f176060870187613c4a565b810190611f2491906135ef565b60095490915074010000000000000000000000000000000000000000900460ff16611f5c57611f5c611f578260016143f1565b612811565b505050505050565b6001611f71600583612935565b14611fab576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c07565b611fb6816000610c17565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611ffe90613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90613b8a565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b5050505050815260200160038201805461209090613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546120bc90613b8a565b80156121095780601f106120de57610100808354040283529160200191612109565b820191906000526020600020905b8154815290600101906020018083116120ec57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561218c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612137565b5050505081525050905061219f81612e11565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906121f790613b8a565b905060000361223e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061226e90613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461229a90613b8a565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161234890613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461237490613b8a565b80156123c15780601f10612396576101008083540402835291602001916123c1565b820191906000526020600020905b8154815290600101906020018083116123a457829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90612428908b908690600401614404565b602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246991906144d1565b60085490915073ffffffffffffffffffffffffffffffffffffffff161580159061252257506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156124fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252091906144d1565b105b1561254c5760085461254c9073ffffffffffffffffffffffffffffffffffffffff16333084612e83565b60005b875181101561269f576125bf33308a848151811061256f5761256f613bdd565b6020026020010151602001518b858151811061258d5761258d613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e83909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106125ef576125ef613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126975760025488516126979173ffffffffffffffffffffffffffffffffffffffff16908a908490811061264857612648613bdd565b6020026020010151602001518a848151811061266657612666613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b8b9092919063ffffffff16565b60010161254f565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156126d25760006126d4565b825b8a856040518463ffffffff1660e01b81526004016126f3929190614404565b60206040518083038185885af1158015612711573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061273691906144d1565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161276991815260200190565b60405180910390a1505050509392505050565b612784612790565b61278d81612ee1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c07565b80600116600103612854576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612888565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161289d91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600854600080855260208501909352909350611518927401000000000000000000000000000000000000000090910467ffffffffffffffff169161292e565b60408051808201909152600080825260208201528152602001906001900390816129075790505b50836121ce565b60006129418383612fd6565b9392505050565b804710156129b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c07565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a0c576040519150601f19603f3d011682016040523d82523d6000602084013e612a11565b606091505b5050905080611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613060565b6000612b8384848461316c565b949350505050565b801580612c2b57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2991906144d1565b155b612cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af4565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da891906144d1565b612db291906143f1565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612e0b9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af4565b50505050565b612e19612790565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e559084906004016136f4565b600060405180830381600087803b158015612e6f57600080fd5b505af115801561130d573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e0b9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612af4565b3373ffffffffffffffffffffffffffffffffffffffff821603612f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c07565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612ffa5750612ffa8484613189565b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c07565b60006130c2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131959092919063ffffffff16565b80519091501561151857808060200190518101906130e091906144ea565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c07565b60008281526002840160205260408120829055612b8384846131a4565b600061294183836131b0565b6060612b8384846000856131c8565b600061294183836132e1565b60008181526001830160205260408120541515612941565b60608247101561325a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c07565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161328391906143df565b60006040518083038185875af1925050503d80600081146132c0576040519150601f19603f3d011682016040523d82523d6000602084013e6132c5565b606091505b50915091506132d687838387613330565b979650505050505050565b6000818152600183016020526040812054613328575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b2565b5060006108b2565b606083156133c65782516000036133bf5773ffffffffffffffffffffffffffffffffffffffff85163b6133bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c07565b5081612b83565b612b8383838151156133db5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c079190613591565b50805461341b90613b8a565b6000825580601f1061342b575050565b601f01602090049060005260206000209081019061278d91905b808211156134595760008155600101613445565b5090565b67ffffffffffffffff8116811461278d57600080fd5b60008060006040848603121561348857600080fd5b83356134938161345d565b9250602084013567ffffffffffffffff808211156134b057600080fd5b818601915086601f8301126134c457600080fd5b8135818111156134d357600080fd5b8760208285010111156134e557600080fd5b6020830194508093505050509250925092565b801515811461278d57600080fd5b60006020828403121561351857600080fd5b8135612941816134f8565b60005b8381101561353e578181015183820152602001613526565b50506000910152565b6000815180845261355f816020860160208601613523565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129416020830184613547565b6000602082840312156135b657600080fd5b81356129418161345d565b6040815260006135d46040830185613547565b82810360208401526135e68185613547565b95945050505050565b60006020828403121561360157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461278d57600080fd5b6000806040838503121561363d57600080fd5b823561364881613608565b946020939093013593505050565b60008060006060848603121561366b57600080fd5b833561367681613608565b9250602084013561368681613608565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136e9578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136ac565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261372e60c0840182613547565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261376a8383613547565b925060808601519150808584030160a0860152506135e68282613697565b6000806040838503121561379b57600080fd5b8235915060208301356137ad81613608565b809150509250929050565b60008083601f8401126137ca57600080fd5b50813567ffffffffffffffff8111156137e257600080fd5b6020830191508360208260051b85010111156137fd57600080fd5b9250929050565b6000806000806040858703121561381a57600080fd5b843567ffffffffffffffff8082111561383257600080fd5b61383e888389016137b8565b9096509450602087013591508082111561385757600080fd5b50613864878288016137b8565b95989497509550505050565b60006020828403121561388257600080fd5b813567ffffffffffffffff81111561389957600080fd5b820160a0818503121561294157600080fd5b6000602082840312156138bd57600080fd5b813561294181613608565b600080602083850312156138db57600080fd5b823567ffffffffffffffff8111156138f257600080fd5b6138fe858286016137b8565b90969095509350505050565b6000806040838503121561391d57600080fd5b82356139288161345d565b915060208301356137ad81613608565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561398a5761398a613938565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139d7576139d7613938565b604052919050565b600082601f8301126139f057600080fd5b813567ffffffffffffffff811115613a0a57613a0a613938565b613a3b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613990565b818152846020838601011115613a5057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8257600080fd5b8335613a8d8161345d565b925060208481013567ffffffffffffffff80821115613aab57600080fd5b818701915087601f830112613abf57600080fd5b813581811115613ad157613ad1613938565b613adf848260051b01613990565b81815260069190911b8301840190848101908a831115613afe57600080fd5b938501935b82851015613b4a576040858c031215613b1c5760008081fd5b613b24613967565b8535613b2f81613608565b81528587013587820152825260409094019390850190613b03565b965050506040870135925080831115613b6257600080fd5b5050613b70868287016139df565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b9e57607f821691505b602082108103613bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c4057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c7f57600080fd5b83018035915067ffffffffffffffff821115613c9a57600080fd5b6020019150368190038213156137fd57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ce457600080fd5b830160208101925035905067ffffffffffffffff811115613d0457600080fd5b8036038213156137fd57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136e9578135613d7f81613608565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d6c565b602081528135602082015260006020830135613dcc8161345d565b67ffffffffffffffff8082166040850152613dea6040860186613caf565b925060a06060860152613e0160c086018483613d13565b925050613e116060860186613caf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e47858385613d13565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e8057600080fd5b60209288019283019235915083821115613e9957600080fd5b8160061b3603831315613eab57600080fd5b8685030160a08701526132d6848284613d5c565b601f821115611518576000816000526020600020601f850160051c81016020861015613ee85750805b601f850160051c820191505b81811015611f5c57828155600101613ef4565b67ffffffffffffffff831115613f1f57613f1f613938565b613f3383613f2d8354613b8a565b83613ebf565b6000601f841160018114613f855760008515613f4f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561130d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fd45786850135825560209485019460019092019101613fb4565b508682101561400f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561405b81613608565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140c1576140c1613938565b80548382558084101561414e5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410257614102614021565b808616861461411357614113614021565b5060008360005260206000208360011b81018760011b820191505b8082101561414957828255828483015560028201915061412e565b505050505b5060008181526020812083915b85811015611f5c5761416d8383614050565b604092909201916002919091019060010161415b565b813581556001810160208301356141998161345d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141d96040860186613c4a565b935091506141eb838360028701613f07565b6141f86060860186613c4a565b9350915061420a838360038701613f07565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424157600080fd5b91840191823591508082111561425657600080fd5b506020820191508060061b360382131561426f57600080fd5b612e0b8183600486016140a8565b815167ffffffffffffffff81111561429757614297613938565b6142ab816142a58454613b8a565b84613ebf565b602080601f8311600181146142fe57600084156142c85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f5c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561434b5788860151825594840194600190910190840161432c565b508582101561438757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c4057600080fd5b602081526000612b83602083018486613d13565b60008251613c40818460208701613523565b808201808211156108b2576108b2614021565b67ffffffffffffffff83168152604060208201526000825160a0604084015261443060e0840182613547565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261446c8383613547565b925060408601519150808584030160808601526144898383613697565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144c78282613547565b9695505050505050565b6000602082840312156144e357600080fd5b5051919050565b6000602082840312156144fc57600080fd5b8151612941816134f856fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI 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 b1689599be..1336ceafb0 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 @@ -57,7 +57,7 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620050f1380380620050f18339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600960156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b6149ad80620007446000396000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e89b448511610064578063e89b44851461066e578063ef686d8e14610681578063f2fde38b146106a1578063ff2deec3146106c157600080fd5b8063c89245d5146105d0578063cf6730f8146105f0578063e4ca875414610610578063e6c725f51461063057600080fd5b8063b187bd26116100d1578063b187bd2614610515578063b5a1101114610545578063bee518a414610565578063c851cc32146105b057600080fd5b80638f491cba1461048a5780639d2aede5146104aa5780639fe74e26146104ca578063b0f479a1146104ea57600080fd5b8063536c6bfa1161017a57806379ba50971161014957806379ba50971461040a5780638462a2b91461041f57806385572ffb1461043f5780638da5cb5b1461045f57600080fd5b8063536c6bfa1461037d5780635e35359e1461039d5780636939cd97146103bd5780636d62d633146103ea57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635075a9d41461034f57600080fd5b80630e958d6b146101f357806316c38b3c14610228578063181f5a771461024a5780631892b906146102a057600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613891565b6106ee565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610248610243366004613924565b610739565b005b34801561025657600080fd5b506102936040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161021f91906139af565b3480156102ac57600080fd5b506102486102bb3660046139c2565b61078b565b3480156102cc57600080fd5b506102486107e6565b3480156102e157600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c3660046139c2565b610822565b60405161021f9291906139df565b34801561035b57600080fd5b5061036f61036a366004613a0d565b61094e565b60405190815260200161021f565b34801561038957600080fd5b50610248610398366004613a48565b610961565b3480156103a957600080fd5b506102486103b8366004613a74565b6109c5565b3480156103c957600080fd5b506103dd6103d8366004613a0d565b610a5a565b60405161021f9190613b12565b3480156103f657600080fd5b50610248610405366004613ba6565b610c65565b34801561041657600080fd5b50610248610f7f565b34801561042b57600080fd5b5061024861043a366004613c22565b61107c565b34801561044b57600080fd5b5061024861045a366004613c8e565b6113bd565b34801561046b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049657600080fd5b506102486104a5366004613a0d565b6115c6565b3480156104b657600080fd5b506102486104c5366004613cc9565b6117a1565b3480156104d657600080fd5b506102486104e5366004613ce6565b611866565b3480156104f657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561052157600080fd5b5060095474010000000000000000000000000000000000000000900460ff16610213565b34801561055157600080fd5b50610248610560366004613d28565b611bf7565b34801561057157600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105bc57600080fd5b506102486105cb366004613cc9565b611d9d565b3480156105dc57600080fd5b506102486105eb366004613cc9565b611e69565b3480156105fc57600080fd5b5061024861060b366004613c8e565b611fd3565b34801561061c57600080fd5b5061024861062b366004613a0d565b6121e8565b34801561063c57600080fd5b506009547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b61036f61067c366004613e8b565b612452565b34801561068d57600080fd5b5061024861069c366004613f98565b6129fc565b3480156106ad57600080fd5b506102486106bc366004613cc9565b612a85565b3480156106cd57600080fd5b506008546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061071d9085908590613fbb565b9081526040519081900360200190205460ff1690509392505050565b610741612a96565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610793612a96565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107ee612a96565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556108206001612b17565b565b60036020526000908152604090208054819061083d90613fcb565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613fcb565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050908060010180546108cb90613fcb565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613fcb565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905082565b600061095b600583612d53565b92915050565b610969612a96565b6109738282612d66565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109cd612a96565b6109ee73ffffffffffffffffffffffffffffffffffffffff84168383612ec0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a4d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ac990613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610af590613fcb565b8015610b425780601f10610b1757610100808354040283529160200191610b42565b820191906000526020600020905b815481529060010190602001808311610b2557829003601f168201915b50505050508152602001600382018054610b5b90613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790613fcb565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c02565b505050915250909392505050565b610c6d612a96565b6001610c7a600584612d53565b14610cb9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610cc98260025b60059190612f94565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610d1190613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90613fcb565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050508152602001600382018054610da390613fcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613fcb565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e9f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e4a565b5050505081525050905060005b816080015151811015610f2e57610f268383608001518381518110610ed357610ed361401e565b60200260200101516020015184608001518481518110610ef557610ef561401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ec09092919063ffffffff16565b600101610eac565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610cb0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611084612a96565b60005b8181101561121757600360008484848181106110a5576110a561401e565b90506020028101906110b7919061404d565b6110c59060208101906139c2565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110fc576110fc61401e565b905060200281019061110e919061404d565b61111c90602081019061408b565b60405161112a929190613fbb565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106111715761117161401e565b9050602002810190611183919061404d565b61119190602081019061408b565b60405161119f929190613fbb565b60405180910390208383838181106111b9576111b961401e565b90506020028101906111cb919061404d565b6111d99060208101906139c2565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611087565b5060005b838110156113b65760016003600087878581811061123b5761123b61401e565b905060200281019061124d919061404d565b61125b9060208101906139c2565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106112925761129261401e565b90506020028101906112a4919061404d565b6112b290602081019061408b565b6040516112c0929190613fbb565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106113105761131061401e565b9050602002810190611322919061404d565b61133090602081019061408b565b60405161133e929190613fbb565b60405180910390208585838181106113585761135861401e565b905060200281019061136a919061404d565b6113789060208101906139c2565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161121b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611410576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610cb0565b61142060408201602083016139c2565b67ffffffffffffffff811660009081526003602052604090208054819061144690613fcb565b905060000361148d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114c99086906004016141f2565b600060405180830381600087803b1580156114e357600080fd5b505af19250505080156114f4575060015b611594573d808015611522576040519150601f19603f3d011682016040523d82523d6000602084013e611527565b606091505b5061153484356001610cc0565b5083356000908152600460205260409020849061155182826145c4565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906115869084906139af565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6009547501000000000000000000000000000000000000000000900460ff16158061160e57506009547501000000000000000000000000000000000000000000900460ff1681105b156116165750565b600954600190611642907501000000000000000000000000000000000000000000900460ff16836146be565b1161179e5760025473ffffffffffffffffffffffffffffffffffffffff166008546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171591906146f9565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175c57600080fd5b505af1158015611770573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6117a9612a96565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906118629082614716565b5050565b61186e612a96565b60005b818110156115c15782828281811061188b5761188b61401e565b905060200281019061189d9190614830565b6118ae906040810190602001613924565b61197a57600360008484848181106118c8576118c861401e565b90506020028101906118da9190614830565b6118e89060208101906139c2565b67ffffffffffffffff1681526020810191909152604001600090812061190d9161382d565b82828281811061191f5761191f61401e565b90506020028101906119319190614830565b61193f9060208101906139c2565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611bef565b82828281811061198c5761198c61401e565b905060200281019061199e9190614830565b6119ac90604081019061408b565b90506000036119e7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106119ff576119ff61401e565b9050602002810190611a119190614830565b611a1f9060208101906139c2565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611a5557611a5561401e565b9050602002810190611a679190614830565b611a7590604081019061408b565b8291611a82919083614348565b50838383818110611a9557611a9561401e565b9050602002810190611aa79190614830565b611ab590606081019061408b565b159050611b0057838383818110611ace57611ace61401e565b9050602002810190611ae09190614830565b611aee90606081019061408b565b6001830191611afe919083614348565b505b838383818110611b1257611b1261401e565b9050602002810190611b249190614830565b611b3290604081019061408b565b604051611b40929190613fbb565b6040518091039020848484818110611b5a57611b5a61401e565b9050602002810190611b6c9190614830565b611b7a9060208101906139c2565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611bb757611bb761401e565b9050602002810190611bc99190614830565b611bd790606081019061408b565b604051611be5929190614864565b60405180910390a3505b600101611871565b611bff612a96565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611cf091614878565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115c19082614716565b611da5612a96565b73ffffffffffffffffffffffffffffffffffffffff8116611df2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611e71612a96565b60085473ffffffffffffffffffffffffffffffffffffffff1615611ed257611ed2611eb160025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612fa9565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611f7f57611f7f611f3f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61312b565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461200c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61201c60408201602083016139c2565b612029604083018361408b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061208092509050613fcb565b159050806120d65750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516120c19190614878565b9081526040519081900360200190205460ff16155b1561210f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610cb091906139af565b61211f60408401602085016139c2565b67ffffffffffffffff811660009081526003602052604090208054819061214590613fcb565b905060000361218c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b600061219b606087018761408b565b8101906121a89190613a0d565b60095490915074010000000000000000000000000000000000000000900460ff166121e0576121e06121db82600161488a565b612b17565b505050505050565b60016121f5600583612d53565b1461222f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610cb0565b61223a816000610cc0565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161228290613fcb565b80601f01602080910402602001604051908101604052809291908181526020018280546122ae90613fcb565b80156122fb5780601f106122d0576101008083540402835291602001916122fb565b820191906000526020600020905b8154815290600101906020018083116122de57829003601f168201915b5050505050815260200160038201805461231490613fcb565b80601f016020809104026020016040519081016040528092919081815260200182805461234090613fcb565b801561238d5780601f106123625761010080835404028352916020019161238d565b820191906000526020600020905b81548152906001019060200180831161237057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156124105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016123bb565b505050508152505090506124238161322f565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061247b90613fcb565b90506000036124c2576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906124f290613fcb565b80601f016020809104026020016040519081016040528092919081815260200182805461251e90613fcb565b801561256b5780601f106125405761010080835404028352916020019161256b565b820191906000526020600020905b81548152906001019060200180831161254e57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916125cc90613fcb565b80601f01602080910402602001604051908101604052809291908181526020018280546125f890613fcb565b80156126455780601f1061261a57610100808354040283529160200191612645565b820191906000526020600020905b81548152906001019060200180831161262857829003601f168201915b5050505050815250905060005b86518110156127a2576126c233308984815181106126725761267261401e565b6020026020010151602001518a85815181106126905761269061401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132a1909392919063ffffffff16565b600854875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106126f2576126f261401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461279a57600254875161279a9173ffffffffffffffffffffffffffffffffffffffff169089908490811061274b5761274b61401e565b6020026020010151602001518984815181106127695761276961401e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612fa99092919063ffffffff16565b600101612652565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded906127fc908b90869060040161489d565b602060405180830381865afa158015612819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283d919061496a565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906128f657506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156128d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f4919061496a565b105b15612920576008546129209073ffffffffffffffffffffffffffffffffffffffff163330846132a1565b60025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612952576000612954565b825b8a856040518463ffffffff1660e01b815260040161297392919061489d565b60206040518083038185885af1158015612991573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129b6919061496a565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516129e991815260200190565b60405180910390a1505050509392505050565b612a04612a96565b600980547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a8d612a96565b61179e816132ff565b60005473ffffffffffffffffffffffffffffffffffffffff163314610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610cb0565b80600116600103612b5a576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b8e565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612b97816115c6565b6040805160a0810190915260095473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612bef91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612c6957816020015b6040805180820190915260008082526020820152815260200190600190039081612c425790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612cc060025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600860149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612d1092919061489d565b6020604051808303816000875af1158015612d2f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c1919061496a565b6000612d5f83836133f4565b9392505050565b80471015612dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cb0565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e2a576040519150601f19603f3d011682016040523d82523d6000602084013e612e2f565b606091505b50509050806115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261347e565b6000612fa184848461358a565b949350505050565b80158061304957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613047919061496a565b155b6130d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f12565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156131a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c6919061496a565b6131d0919061488a565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506132299085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f12565b50505050565b613237612a96565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890613273908490600401613b12565b600060405180830381600087803b15801561328d57600080fd5b505af11580156113b6573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612f12565b3373ffffffffffffffffffffffffffffffffffffffff82160361337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610cb0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580613418575061341884846135a7565b612d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610cb0565b60006134e0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135b39092919063ffffffff16565b8051909150156115c157808060200190518101906134fe9190614983565b6115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610cb0565b60008281526002840160205260408120829055612fa184846135c2565b6000612d5f83836135ce565b6060612fa184846000856135e6565b6000612d5f83836136ff565b60008181526001830160205260408120541515612d5f565b606082471015613678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610cb0565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136a19190614878565b60006040518083038185875af1925050503d80600081146136de576040519150601f19603f3d011682016040523d82523d6000602084013e6136e3565b606091505b50915091506136f48783838761374e565b979650505050505050565b60008181526001830160205260408120546137465750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561095b565b50600061095b565b606083156137e45782516000036137dd5773ffffffffffffffffffffffffffffffffffffffff85163b6137dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cb0565b5081612fa1565b612fa183838151156137f95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb091906139af565b50805461383990613fcb565b6000825580601f10613849575050565b601f01602090049060005260206000209081019061179e91905b808211156138775760008155600101613863565b5090565b67ffffffffffffffff8116811461179e57600080fd5b6000806000604084860312156138a657600080fd5b83356138b18161387b565b9250602084013567ffffffffffffffff808211156138ce57600080fd5b818601915086601f8301126138e257600080fd5b8135818111156138f157600080fd5b87602082850101111561390357600080fd5b6020830194508093505050509250925092565b801515811461179e57600080fd5b60006020828403121561393657600080fd5b8135612d5f81613916565b60005b8381101561395c578181015183820152602001613944565b50506000910152565b6000815180845261397d816020860160208601613941565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d5f6020830184613965565b6000602082840312156139d457600080fd5b8135612d5f8161387b565b6040815260006139f26040830185613965565b8281036020840152613a048185613965565b95945050505050565b600060208284031215613a1f57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179e57600080fd5b60008060408385031215613a5b57600080fd5b8235613a6681613a26565b946020939093013593505050565b600080600060608486031215613a8957600080fd5b8335613a9481613a26565b92506020840135613aa481613a26565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b07578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613aca565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613b4c60c0840182613965565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613b888383613965565b925060808601519150808584030160a086015250613a048282613ab5565b60008060408385031215613bb957600080fd5b823591506020830135613bcb81613a26565b809150509250929050565b60008083601f840112613be857600080fd5b50813567ffffffffffffffff811115613c0057600080fd5b6020830191508360208260051b8501011115613c1b57600080fd5b9250929050565b60008060008060408587031215613c3857600080fd5b843567ffffffffffffffff80821115613c5057600080fd5b613c5c88838901613bd6565b90965094506020870135915080821115613c7557600080fd5b50613c8287828801613bd6565b95989497509550505050565b600060208284031215613ca057600080fd5b813567ffffffffffffffff811115613cb757600080fd5b820160a08185031215612d5f57600080fd5b600060208284031215613cdb57600080fd5b8135612d5f81613a26565b60008060208385031215613cf957600080fd5b823567ffffffffffffffff811115613d1057600080fd5b613d1c85828601613bd6565b90969095509350505050565b60008060408385031215613d3b57600080fd5b8235613d468161387b565b91506020830135613bcb81613a26565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613da857613da8613d56565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613df557613df5613d56565b604052919050565b600082601f830112613e0e57600080fd5b813567ffffffffffffffff811115613e2857613e28613d56565b613e5960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613dae565b818152846020838601011115613e6e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613ea057600080fd5b8335613eab8161387b565b925060208481013567ffffffffffffffff80821115613ec957600080fd5b818701915087601f830112613edd57600080fd5b813581811115613eef57613eef613d56565b613efd848260051b01613dae565b81815260069190911b8301840190848101908a831115613f1c57600080fd5b938501935b82851015613f68576040858c031215613f3a5760008081fd5b613f42613d85565b8535613f4d81613a26565b81528587013587820152825260409094019390850190613f21565b965050506040870135925080831115613f8057600080fd5b5050613f8e86828701613dfd565b9150509250925092565b600060208284031215613faa57600080fd5b813560ff81168114612d5f57600080fd5b8183823760009101908152919050565b600181811c90821680613fdf57607f821691505b602082108103614018577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261408157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140c057600080fd5b83018035915067ffffffffffffffff8211156140db57600080fd5b602001915036819003821315613c1b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261412557600080fd5b830160208101925035905067ffffffffffffffff81111561414557600080fd5b803603821315613c1b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b075781356141c081613a26565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016141ad565b60208152813560208201526000602083013561420d8161387b565b67ffffffffffffffff808216604085015261422b60408601866140f0565b925060a0606086015261424260c086018483614154565b92505061425260608601866140f0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152614288858385614154565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126142c157600080fd5b602092880192830192359150838211156142da57600080fd5b8160061b36038313156142ec57600080fd5b8685030160a08701526136f484828461419d565b601f8211156115c1576000816000526020600020601f850160051c810160208610156143295750805b601f850160051c820191505b818110156121e057828155600101614335565b67ffffffffffffffff83111561436057614360613d56565b6143748361436e8354613fcb565b83614300565b6000601f8411600181146143c657600085156143905750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556113b6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561441557868501358255602094850194600190920191016143f5565b5086821015614450577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561449c81613a26565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561450257614502613d56565b80548382558084101561458f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461454357614543614462565b808616861461455457614554614462565b5060008360005260206000208360011b81018760011b820191505b8082101561458a57828255828483015560028201915061456f565b505050505b5060008181526020812083915b858110156121e0576145ae8383614491565b604092909201916002919091019060010161459c565b813581556001810160208301356145da8161387b565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561461a604086018661408b565b9350915061462c838360028701614348565b614639606086018661408b565b9350915061464b838360038701614348565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261468257600080fd5b91840191823591508082111561469757600080fd5b506020820191508060061b36038213156146b057600080fd5b6132298183600486016144e9565b6000826146f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561470b57600080fd5b8151612d5f81613a26565b815167ffffffffffffffff81111561473057614730613d56565b6147448161473e8454613fcb565b84614300565b602080601f83116001811461479757600084156147615750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556121e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147e4578886015182559484019460019091019084016147c5565b508582101561482057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261408157600080fd5b602081526000612fa1602083018486614154565b60008251614081818460208701613941565b8082018082111561095b5761095b614462565b67ffffffffffffffff83168152604060208201526000825160a060408401526148c960e0840182613965565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526149058383613965565b925060408601519150808584030160808601526149228383613ab5565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149608282613965565b9695505050505050565b60006020828403121561497c57600080fd5b5051919050565b60006020828403121561499557600080fd5b8151612d5f8161391656fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b50604051620050f5380380620050f58339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600960156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b6149b180620007446000396000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e89b448511610064578063e89b44851461066e578063ef686d8e14610681578063f2fde38b146106a1578063ff2deec3146106c157600080fd5b8063c89245d5146105d0578063cf6730f8146105f0578063e4ca875414610610578063e6c725f51461063057600080fd5b8063b187bd26116100d1578063b187bd2614610515578063b5a1101114610545578063bee518a414610565578063c851cc32146105b057600080fd5b80638f491cba1461048a5780639d2aede5146104aa5780639fe74e26146104ca578063b0f479a1146104ea57600080fd5b8063536c6bfa1161017a57806379ba50971161014957806379ba50971461040a5780638462a2b91461041f57806385572ffb1461043f5780638da5cb5b1461045f57600080fd5b8063536c6bfa1461037d5780635e35359e1461039d5780636939cd97146103bd5780636d62d633146103ea57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635075a9d41461034f57600080fd5b80630e958d6b146101f357806316c38b3c14610228578063181f5a771461024a5780631892b906146102a057600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613895565b6106ee565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610248610243366004613928565b610739565b005b34801561025657600080fd5b506102936040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161021f91906139b3565b3480156102ac57600080fd5b506102486102bb3660046139c6565b61078b565b3480156102cc57600080fd5b506102486107e6565b3480156102e157600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c3660046139c6565b610822565b60405161021f9291906139e3565b34801561035b57600080fd5b5061036f61036a366004613a11565b61094e565b60405190815260200161021f565b34801561038957600080fd5b50610248610398366004613a4c565b610961565b3480156103a957600080fd5b506102486103b8366004613a78565b6109c5565b3480156103c957600080fd5b506103dd6103d8366004613a11565b610a5a565b60405161021f9190613b16565b3480156103f657600080fd5b50610248610405366004613baa565b610c65565b34801561041657600080fd5b50610248610f7f565b34801561042b57600080fd5b5061024861043a366004613c26565b61107c565b34801561044b57600080fd5b5061024861045a366004613c92565b6113bd565b34801561046b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049657600080fd5b506102486104a5366004613a11565b6115c6565b3480156104b657600080fd5b506102486104c5366004613ccd565b6117a1565b3480156104d657600080fd5b506102486104e5366004613cea565b611866565b3480156104f657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561052157600080fd5b5060095474010000000000000000000000000000000000000000900460ff16610213565b34801561055157600080fd5b50610248610560366004613d2c565b611bf7565b34801561057157600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105bc57600080fd5b506102486105cb366004613ccd565b611d9d565b3480156105dc57600080fd5b506102486105eb366004613ccd565b611e69565b3480156105fc57600080fd5b5061024861060b366004613c92565b611fd3565b34801561061c57600080fd5b5061024861062b366004613a11565b6121e8565b34801561063c57600080fd5b506009547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b61036f61067c366004613e8f565b612452565b34801561068d57600080fd5b5061024861069c366004613f9c565b612a00565b3480156106ad57600080fd5b506102486106bc366004613ccd565b612a89565b3480156106cd57600080fd5b506008546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061071d9085908590613fbf565b9081526040519081900360200190205460ff1690509392505050565b610741612a9a565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610793612a9a565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107ee612a9a565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556108206001612b1b565b565b60036020526000908152604090208054819061083d90613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613fcf565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050908060010180546108cb90613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613fcf565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905082565b600061095b600583612d57565b92915050565b610969612a9a565b6109738282612d6a565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109cd612a9a565b6109ee73ffffffffffffffffffffffffffffffffffffffff84168383612ec4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a4d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ac990613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610af590613fcf565b8015610b425780601f10610b1757610100808354040283529160200191610b42565b820191906000526020600020905b815481529060010190602001808311610b2557829003601f168201915b50505050508152602001600382018054610b5b90613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790613fcf565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c02565b505050915250909392505050565b610c6d612a9a565b6001610c7a600584612d57565b14610cb9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610cc98260025b60059190612f98565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610d1190613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90613fcf565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050508152602001600382018054610da390613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613fcf565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e9f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e4a565b5050505081525050905060005b816080015151811015610f2e57610f268383608001518381518110610ed357610ed3614022565b60200260200101516020015184608001518481518110610ef557610ef5614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ec49092919063ffffffff16565b600101610eac565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610cb0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611084612a9a565b60005b8181101561121757600360008484848181106110a5576110a5614022565b90506020028101906110b79190614051565b6110c59060208101906139c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110fc576110fc614022565b905060200281019061110e9190614051565b61111c90602081019061408f565b60405161112a929190613fbf565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061117157611171614022565b90506020028101906111839190614051565b61119190602081019061408f565b60405161119f929190613fbf565b60405180910390208383838181106111b9576111b9614022565b90506020028101906111cb9190614051565b6111d99060208101906139c6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611087565b5060005b838110156113b65760016003600087878581811061123b5761123b614022565b905060200281019061124d9190614051565b61125b9060208101906139c6565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061129257611292614022565b90506020028101906112a49190614051565b6112b290602081019061408f565b6040516112c0929190613fbf565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061131057611310614022565b90506020028101906113229190614051565b61133090602081019061408f565b60405161133e929190613fbf565b604051809103902085858381811061135857611358614022565b905060200281019061136a9190614051565b6113789060208101906139c6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161121b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611410576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610cb0565b61142060408201602083016139c6565b67ffffffffffffffff811660009081526003602052604090208054819061144690613fcf565b905060000361148d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114c99086906004016141f6565b600060405180830381600087803b1580156114e357600080fd5b505af19250505080156114f4575060015b611594573d808015611522576040519150601f19603f3d011682016040523d82523d6000602084013e611527565b606091505b5061153484356001610cc0565b5083356000908152600460205260409020849061155182826145c8565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906115869084906139b3565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6009547501000000000000000000000000000000000000000000900460ff16158061160e57506009547501000000000000000000000000000000000000000000900460ff1681105b156116165750565b600954600190611642907501000000000000000000000000000000000000000000900460ff16836146c2565b1161179e5760025473ffffffffffffffffffffffffffffffffffffffff166008546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171591906146fd565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175c57600080fd5b505af1158015611770573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6117a9612a9a565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff16600090815260036020522090611862908261471a565b5050565b61186e612a9a565b60005b818110156115c15782828281811061188b5761188b614022565b905060200281019061189d9190614834565b6118ae906040810190602001613928565b61197a57600360008484848181106118c8576118c8614022565b90506020028101906118da9190614834565b6118e89060208101906139c6565b67ffffffffffffffff1681526020810191909152604001600090812061190d91613831565b82828281811061191f5761191f614022565b90506020028101906119319190614834565b61193f9060208101906139c6565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611bef565b82828281811061198c5761198c614022565b905060200281019061199e9190614834565b6119ac90604081019061408f565b90506000036119e7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106119ff576119ff614022565b9050602002810190611a119190614834565b611a1f9060208101906139c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611a5557611a55614022565b9050602002810190611a679190614834565b611a7590604081019061408f565b8291611a8291908361434c565b50838383818110611a9557611a95614022565b9050602002810190611aa79190614834565b611ab590606081019061408f565b159050611b0057838383818110611ace57611ace614022565b9050602002810190611ae09190614834565b611aee90606081019061408f565b6001830191611afe91908361434c565b505b838383818110611b1257611b12614022565b9050602002810190611b249190614834565b611b3290604081019061408f565b604051611b40929190613fbf565b6040518091039020848484818110611b5a57611b5a614022565b9050602002810190611b6c9190614834565b611b7a9060208101906139c6565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611bb757611bb7614022565b9050602002810190611bc99190614834565b611bd790606081019061408f565b604051611be5929190614868565b60405180910390a3505b600101611871565b611bff612a9a565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611cf09161487c565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115c1908261471a565b611da5612a9a565b73ffffffffffffffffffffffffffffffffffffffff8116611df2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611e71612a9a565b60085473ffffffffffffffffffffffffffffffffffffffff1615611ed257611ed2611eb160025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612fad565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611f7f57611f7f611f3f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61312f565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461200c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61201c60408201602083016139c6565b612029604083018361408f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061208092509050613fcf565b159050806120d65750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516120c1919061487c565b9081526040519081900360200190205460ff16155b1561210f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610cb091906139b3565b61211f60408401602085016139c6565b67ffffffffffffffff811660009081526003602052604090208054819061214590613fcf565b905060000361218c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b600061219b606087018761408f565b8101906121a89190613a11565b60095490915074010000000000000000000000000000000000000000900460ff166121e0576121e06121db82600161488e565b612b1b565b505050505050565b60016121f5600583612d57565b1461222f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610cb0565b61223a816000610cc0565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161228290613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546122ae90613fcf565b80156122fb5780601f106122d0576101008083540402835291602001916122fb565b820191906000526020600020905b8154815290600101906020018083116122de57829003601f168201915b5050505050815260200160038201805461231490613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461234090613fcf565b801561238d5780601f106123625761010080835404028352916020019161238d565b820191906000526020600020905b81548152906001019060200180831161237057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156124105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016123bb565b5050505081525050905061242381613233565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061247b90613fcf565b90506000036124c2576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906124f290613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461251e90613fcf565b801561256b5780601f106125405761010080835404028352916020019161256b565b820191906000526020600020905b81548152906001019060200180831161254e57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916125cc90613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546125f890613fcf565b80156126455780601f1061261a57610100808354040283529160200191612645565b820191906000526020600020905b81548152906001019060200180831161262857829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906126ac908b9086906004016148a1565b602060405180830381865afa1580156126c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ed919061496e565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906127a657506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a4919061496e565b105b156127d0576008546127d09073ffffffffffffffffffffffffffffffffffffffff163330846132a5565b60005b87518110156129235761284333308a84815181106127f3576127f3614022565b6020026020010151602001518b858151811061281157612811614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132a5909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061287357612873614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461291b57600254885161291b9173ffffffffffffffffffffffffffffffffffffffff16908a90849081106128cc576128cc614022565b6020026020010151602001518a84815181106128ea576128ea614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612fad9092919063ffffffff16565b6001016127d3565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612956576000612958565b825b8a856040518463ffffffff1660e01b81526004016129779291906148a1565b60206040518083038185885af1158015612995573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129ba919061496e565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516129ed91815260200190565b60405180910390a1505050509392505050565b612a08612a9a565b600980547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a91612a9a565b61179e81613303565b60005473ffffffffffffffffffffffffffffffffffffffff163314610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610cb0565b80600116600103612b5e576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b92565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612b9b816115c6565b6040805160a0810190915260095473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612bf391815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612c6d57816020015b6040805180820190915260008082526020820152815260200190600190039081612c465790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612cc460025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600860149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612d149291906148a1565b6020604051808303816000875af1158015612d33573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c1919061496e565b6000612d6383836133f8565b9392505050565b80471015612dd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cb0565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b50509050806115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613482565b6000612fa584848461358e565b949350505050565b80158061304d57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304b919061496e565b155b6130d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f16565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156131a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ca919061496e565b6131d4919061488e565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061322d9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f16565b50505050565b61323b612a9a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890613277908490600401613b16565b600060405180830381600087803b15801561329157600080fd5b505af11580156113b6573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261322d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612f16565b3373ffffffffffffffffffffffffffffffffffffffff821603613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610cb0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061341c575061341c84846135ab565b612d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610cb0565b60006134e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135b79092919063ffffffff16565b8051909150156115c157808060200190518101906135029190614987565b6115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610cb0565b60008281526002840160205260408120829055612fa584846135c6565b6000612d6383836135d2565b6060612fa584846000856135ea565b6000612d638383613703565b60008181526001830160205260408120541515612d63565b60608247101561367c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610cb0565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136a5919061487c565b60006040518083038185875af1925050503d80600081146136e2576040519150601f19603f3d011682016040523d82523d6000602084013e6136e7565b606091505b50915091506136f887838387613752565b979650505050505050565b600081815260018301602052604081205461374a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561095b565b50600061095b565b606083156137e85782516000036137e15773ffffffffffffffffffffffffffffffffffffffff85163b6137e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cb0565b5081612fa5565b612fa583838151156137fd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb091906139b3565b50805461383d90613fcf565b6000825580601f1061384d575050565b601f01602090049060005260206000209081019061179e91905b8082111561387b5760008155600101613867565b5090565b67ffffffffffffffff8116811461179e57600080fd5b6000806000604084860312156138aa57600080fd5b83356138b58161387f565b9250602084013567ffffffffffffffff808211156138d257600080fd5b818601915086601f8301126138e657600080fd5b8135818111156138f557600080fd5b87602082850101111561390757600080fd5b6020830194508093505050509250925092565b801515811461179e57600080fd5b60006020828403121561393a57600080fd5b8135612d638161391a565b60005b83811015613960578181015183820152602001613948565b50506000910152565b60008151808452613981816020860160208601613945565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d636020830184613969565b6000602082840312156139d857600080fd5b8135612d638161387f565b6040815260006139f66040830185613969565b8281036020840152613a088185613969565b95945050505050565b600060208284031215613a2357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179e57600080fd5b60008060408385031215613a5f57600080fd5b8235613a6a81613a2a565b946020939093013593505050565b600080600060608486031215613a8d57600080fd5b8335613a9881613a2a565b92506020840135613aa881613a2a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b0b578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613ace565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613b5060c0840182613969565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613b8c8383613969565b925060808601519150808584030160a086015250613a088282613ab9565b60008060408385031215613bbd57600080fd5b823591506020830135613bcf81613a2a565b809150509250929050565b60008083601f840112613bec57600080fd5b50813567ffffffffffffffff811115613c0457600080fd5b6020830191508360208260051b8501011115613c1f57600080fd5b9250929050565b60008060008060408587031215613c3c57600080fd5b843567ffffffffffffffff80821115613c5457600080fd5b613c6088838901613bda565b90965094506020870135915080821115613c7957600080fd5b50613c8687828801613bda565b95989497509550505050565b600060208284031215613ca457600080fd5b813567ffffffffffffffff811115613cbb57600080fd5b820160a08185031215612d6357600080fd5b600060208284031215613cdf57600080fd5b8135612d6381613a2a565b60008060208385031215613cfd57600080fd5b823567ffffffffffffffff811115613d1457600080fd5b613d2085828601613bda565b90969095509350505050565b60008060408385031215613d3f57600080fd5b8235613d4a8161387f565b91506020830135613bcf81613a2a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613dac57613dac613d5a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613df957613df9613d5a565b604052919050565b600082601f830112613e1257600080fd5b813567ffffffffffffffff811115613e2c57613e2c613d5a565b613e5d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613db2565b818152846020838601011115613e7257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613ea457600080fd5b8335613eaf8161387f565b925060208481013567ffffffffffffffff80821115613ecd57600080fd5b818701915087601f830112613ee157600080fd5b813581811115613ef357613ef3613d5a565b613f01848260051b01613db2565b81815260069190911b8301840190848101908a831115613f2057600080fd5b938501935b82851015613f6c576040858c031215613f3e5760008081fd5b613f46613d89565b8535613f5181613a2a565b81528587013587820152825260409094019390850190613f25565b965050506040870135925080831115613f8457600080fd5b5050613f9286828701613e01565b9150509250925092565b600060208284031215613fae57600080fd5b813560ff81168114612d6357600080fd5b8183823760009101908152919050565b600181811c90821680613fe357607f821691505b60208210810361401c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261408557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140c457600080fd5b83018035915067ffffffffffffffff8211156140df57600080fd5b602001915036819003821315613c1f57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261412957600080fd5b830160208101925035905067ffffffffffffffff81111561414957600080fd5b803603821315613c1f57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b0b5781356141c481613a2a565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016141b1565b6020815281356020820152600060208301356142118161387f565b67ffffffffffffffff808216604085015261422f60408601866140f4565b925060a0606086015261424660c086018483614158565b92505061425660608601866140f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261428c858385614158565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126142c557600080fd5b602092880192830192359150838211156142de57600080fd5b8160061b36038313156142f057600080fd5b8685030160a08701526136f88482846141a1565b601f8211156115c1576000816000526020600020601f850160051c8101602086101561432d5750805b601f850160051c820191505b818110156121e057828155600101614339565b67ffffffffffffffff83111561436457614364613d5a565b614378836143728354613fcf565b83614304565b6000601f8411600181146143ca57600085156143945750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556113b6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561441957868501358255602094850194600190920191016143f9565b5086821015614454577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356144a081613a2a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561450657614506613d5a565b8054838255808410156145935760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461454757614547614466565b808616861461455857614558614466565b5060008360005260206000208360011b81018760011b820191505b8082101561458e578282558284830155600282019150614573565b505050505b5060008181526020812083915b858110156121e0576145b28383614495565b60409290920191600291909101906001016145a0565b813581556001810160208301356145de8161387f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561461e604086018661408f565b9350915061463083836002870161434c565b61463d606086018661408f565b9350915061464f83836003870161434c565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261468657600080fd5b91840191823591508082111561469b57600080fd5b506020820191508060061b36038213156146b457600080fd5b61322d8183600486016144ed565b6000826146f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561470f57600080fd5b8151612d6381613a2a565b815167ffffffffffffffff81111561473457614734613d5a565b614748816147428454613fcf565b84614304565b602080601f83116001811461479b57600084156147655750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556121e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147e8578886015182559484019460019091019084016147c9565b508582101561482457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261408557600080fd5b602081526000612fa5602083018486614158565b60008251614085818460208701613945565b8082018082111561095b5761095b614466565b67ffffffffffffffff83168152604060208201526000825160a060408401526148cd60e0840182613969565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526149098383613969565b925060408601519150808584030160808601526149268383613ab9565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149648282613969565b9695505050505050565b60006020828403121561498057600080fd5b5051919050565b60006020828403121561499957600080fd5b8151612d638161391a56fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 7815717d7f..ab34f1f8cf 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,8 +5,8 @@ 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 78bd19051a85a8417f317e257d5280e1421ae4aeee8361740948385eb41e1584 -ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 446a05c235e14f263764f126ce06602c7035aab4bb984b204d40c89646cd7b09 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 4932475a952db4147b70dab5d4e21c38bd0c7c8af1698bbe85d6759f0e0e3b53 +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin cb4576ac3190fd904ead1857cedf53456daf68f733560d165187f3742748d1cd ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0d7d496ff6aaf37fcf8db25c708b6977c841650027a2028c864f7a0e17fa7b08 ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e6bfb15f1f320cceb76435f49b43c90bfcfc69b4561c811c4b938a6356a23566 ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin e142b529faf36c9dbc55be72947493f235e1d6ac2d76658a2273ac8e53ac4f5e @@ -29,12 +29,12 @@ 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 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin e468bfda33b1726ce175b748383045773022ecbb0dfc7b53f452adba3d7a1307 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin b883c345ea43c1cfa7fcfd1bc8aeb3de8f75b41b2b4f5e2b4f1a33965831264b 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 report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 4a23adcd2bd9869f48824c0da4896f3d6a8be9f95acf691e312de60a397d0a33 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin ed68491cdc4c9a119682ab563a67705915f06599dd9de28516039d419904c896 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 3f76b9fdce1d8d9ee1fbbb99c121ad8a6be3c64c Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Tue, 16 Jul 2024 13:45:19 +0200 Subject: [PATCH 46/61] typos --- contracts/gas-snapshots/ccip.gas-snapshot | 6 +++--- .../v0.8/ccip/applications/external/CCIPBase.sol | 6 +++--- .../v0.8/ccip/applications/external/CCIPClient.sol | 2 +- .../applications/external/CCIPClientWithACK.sol | 2 +- .../ccip/applications/external/CCIPReceiver.sol | 13 ++++++------- .../applications/external/CCIPReceiverWithACK.sol | 11 ++++++----- .../v0.8/ccip/applications/external/CCIPSender.sol | 2 +- .../ccip/applications/internal/PingPongDemo.sol | 5 ----- .../ccip/generated/ping_pong_demo/ping_pong_demo.go | 2 +- .../self_funded_ping_pong/self_funded_ping_pong.go | 2 +- ...ated-wrapper-dependency-versions-do-not-edit.txt | 4 ++-- 11 files changed, 25 insertions(+), 30 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 175e6a67a4..6ee16f4622 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -703,7 +703,7 @@ 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: 179566) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 179093) PingPong_example_plumbing:test_Pausing_Success() (gas: 17917) PingPong_example_plumbing:test_typeAndVersion() (gas: 9786) PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203459) @@ -853,8 +853,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: 291579) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 448569) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 291110) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 445731) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) 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/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index c49887a857..6e6b52b91b 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -23,7 +23,7 @@ abstract contract CCIPBase is OwnerIsCreator { event CCIPRouterModified(address indexed oldRouter, address indexed newRouter); event TokensWithdrawnByOwner(address indexed token, address indexed to, uint256 amount); - // Parameters are indexed to simplyify indexing of cross-chain dapps where contracts may be deployed with the same address. + // Parameters are indexed to simplify indexing of cross-chain dapps where contracts may be deployed with the same address. // Since the updateApprovedSenders() function should be used sparingly by the contract owner, the additional gas cost should be negligible. If this function is needed to be used constantly, or with a large number of // contracts, then an alternative and more gas-efficient method should be implemented instead, e.g. with merkle trees or indexing the parameters can be removed. event ApprovedSenderAdded(uint64 indexed destChainSelector, bytes indexed recipient); @@ -33,7 +33,7 @@ abstract contract CCIPBase is OwnerIsCreator { event ChainRemoved(uint64 indexed removeChainSelector); struct ApprovedSenderUpdate { - uint64 destChainSelector; // Chainselector for a source chain that is allowed to call this dapp + uint64 destChainSelector; // ChainSelector for a source chain that is allowed to call this dapp bytes sender; // The sender address on source chain that is allowed to call, ABI encoded in the case of a remote EVM chain } @@ -128,7 +128,7 @@ abstract contract CCIPBase is OwnerIsCreator { } /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error or withdraw any fee-tokens which were sent as a source of fee-token pre-funding - /// @dev This should NOT be used for recoverying tokens from a failed message. Token recoveries can happen only if + /// @dev This should NOT be used for recovering tokens from a failed message. Token recoveries can happen only if /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. /// For implementation of token recovery, see inheriting contracts. /// @param to A payable address to send the recovered tokens to diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index df324b0885..f225a19808 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -64,7 +64,7 @@ contract CCIPClient is CCIPReceiver { } } - // messageId is only generated in the on-ramp, and therefore cannot be calcualated head of time. + // messageId is only generated in the on-ramp, and therefore cannot be calculated head of time. // This necessitates breaking CEI but since the router is a trusted contract, any risks are negligible. messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( destChainSelector, message diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index 3c05cad5c5..9312760ed7 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -10,7 +10,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// @title CCIPClientWithACK /// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. -/// @dev ccipSend functionality has been inherited from CCIPClient.sol, and _sendACK() from CCIPReceiverWithACK, so only processMessage() must be overridden to enable full functionality for processing incoming messages for ACK's +/// @dev ccipSend functionality has been inherited from CCIPClient.sol, and _sendACK() from CCIPReceiverWithACK, so only processMessage() must be overridden to enable full functionality for processing incoming messages for ACKs contract CCIPClientWithACK is CCIPReceiverWithACK { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 7b9b0b97cc..f2c81a87e0 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -26,12 +26,12 @@ contract CCIPReceiver is CCIPBase { enum ErrorCode { RESOLVED, // RESOLVED is the default status for any incoming message, unless execution fails and it is marked as FAILED. FAILED, // FAILED messages are messages which reverted during execution of processMessage() as part of the ccipReceive() try catch loop. - ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable, and can only be triggered by the contract owner. - // Only a message that was previously marked as FAILED can be abandoned. + ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable and + // can only be triggered by the contract owner. Only a message that was previously marked as FAILED can be abandoned. } - // The message contents of failed messages are stored here. + // Failed messages are stored here. mapping(bytes32 messageId => Client.Any2EVMMessage contents) internal s_messageContents; // Contains failed messages and their state. @@ -86,7 +86,7 @@ contract CCIPReceiver is CCIPBase { // ================================================================ // │ Failed Message Processing | - // ================== ============================================== + // ================================================================ /// @notice Executes a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. @@ -95,14 +95,13 @@ contract CCIPReceiver is CCIPBase { 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 - // multiple times. + // Set the error code to 0 to disallow reentry and retry the same failed message multiple times. s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); // Allow developer to implement arbitrary functionality on retried messages, such as just releasing the associated tokens Client.Any2EVMMessage memory message = s_messageContents[messageId]; - // Allow the user override the implementation, since different workflow may be desired for retrying a merssage + // Allow the user override the implementation, since different workflow may be desired for retrying a message _retryFailedMessage(message); emit MessageRecovered(messageId); diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index c2f9639b83..415e411939 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -7,12 +7,13 @@ 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"; /// @title CCIPReceiverWithACK -/// @notice Acts as a CCIP receiver, but upon receiving an incoming message, attempts to send a response back to the sender with an ACK packet indicating they received and processed the initial correspondence correctly. -/// @dev Messages received by this contract must be of special formatting in which any arbitrary data is first wrapped inside a MessagePayload struct, and must be processed first to ensure conformity. +/// @notice Acts as a CCIP receiver, but upon receiving an incoming message, attempts to send a response back to the +/// sender with an ACK packet indicating they received and processed the initial request correctly. +/// @dev Messages received by this contract must be of special formatting in which any arbitrary data is first wrapped +/// inside a MessagePayload struct, and must be processed first to ensure conformity. contract CCIPReceiverWithACK is CCIPReceiver { using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.Bytes32ToUintMap; @@ -130,10 +131,10 @@ contract CCIPReceiverWithACK is CCIPReceiver { uint256 feeAmount = IRouterClient(s_ccipRouter).getFee(incomingMessage.sourceChainSelector, outgoingMessage); - bytes32 ACKmessageId = IRouterClient(s_ccipRouter).ccipSend{ + bytes32 ACKMessageId = IRouterClient(s_ccipRouter).ccipSend{ value: address(s_feeToken) == address(0) ? feeAmount : 0 }(incomingMessage.sourceChainSelector, outgoingMessage); - emit MessageSent(incomingMessage.messageId, ACKmessageId); + emit MessageSent(incomingMessage.messageId, ACKMessageId); } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index 3050786fa4..eb9dd54c38 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -21,7 +21,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// 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. +/// new chain family receivers (e.g. a Solana encoded receiver address) without upgrading. contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 0408d0802a..72a6b11cd2 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -5,12 +5,9 @@ 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"; /// @title PingPongDemo - A simple ping-pong contract for demonstrating cross-chain communication contract PingPongDemo is CCIPClient { - using SafeERC20 for IERC20; - event Ping(uint256 pingPongCount); event Pong(uint256 pingPongCount); @@ -63,7 +60,6 @@ contract PingPongDemo is CCIPClient { override onlySelf isValidSender(message.sourceChainSelector, message.sender) - isValidChain(message.sourceChainSelector) { uint256 pingPongCount = abi.decode(message.data, (uint256)); if (!s_isPaused) { @@ -80,7 +76,6 @@ contract PingPongDemo is CCIPClient { s_counterpartAddress = counterpartAddress; // Approve the counterpart contract under validSender - // s_approvedSenders[counterpartChainSelector][abi.encode(counterpartAddress)] = true; s_chainConfigs[counterpartChainSelector].approvedSender[abi.encode(counterpartAddress)] = true; // Approve the counterpart Chain selector under validChain 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 6735d0479c..eb1c1f3732 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 @@ -57,7 +57,7 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004bde38038062004bde8339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b61451480620006ca6000396000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063e4ca875411610064578063e4ca8754146105c5578063e89b4485146105e5578063f2fde38b146105f8578063ff2deec31461061857600080fd5b8063bee518a41461051a578063c851cc3214610565578063c89245d514610585578063cf6730f8146105a557600080fd5b80639fe74e26116100d15780639fe74e261461047f578063b0f479a11461049f578063b187bd26146104ca578063b5a11011146104fa57600080fd5b806385572ffb146104145780638da5cb5b146104345780639d2aede51461045f57600080fd5b80635075a9d4116101645780636939cd971161013e5780636939cd97146103925780636d62d633146103bf57806379ba5097146103df5780638462a2b9146103f457600080fd5b80635075a9d414610324578063536c6bfa146103525780635e35359e1461037257600080fd5b80631892b906116101a05780631892b906146102755780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630e958d6b146101d257806316c38b3c14610207578063181f5a771461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004613473565b610645565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004613506565b610690565b005b34801561023557600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e332e300000000000000000000000000000602082015290516101fe9190613591565b34801561028157600080fd5b506102276102903660046135a4565b6106e2565b3480156102a157600080fd5b5061022761073d565b3480156102b657600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b506103166103113660046135a4565b610779565b6040516101fe9291906135c1565b34801561033057600080fd5b5061034461033f3660046135ef565b6108a5565b6040519081526020016101fe565b34801561035e57600080fd5b5061022761036d36600461362a565b6108b8565b34801561037e57600080fd5b5061022761038d366004613656565b61091c565b34801561039e57600080fd5b506103b26103ad3660046135ef565b6109b1565b6040516101fe91906136f4565b3480156103cb57600080fd5b506102276103da366004613788565b610bbc565b3480156103eb57600080fd5b50610227610ed6565b34801561040057600080fd5b5061022761040f366004613804565b610fd3565b34801561042057600080fd5b5061022761042f366004613870565b611314565b34801561044057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561046b57600080fd5b5061022761047a3660046138ab565b61151d565b34801561048b57600080fd5b5061022761049a3660046138c8565b6115e2565b3480156104ab57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104d657600080fd5b5060095474010000000000000000000000000000000000000000900460ff166101f2565b34801561050657600080fd5b5061022761051536600461390a565b611973565b34801561052657600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561057157600080fd5b506102276105803660046138ab565b611b19565b34801561059157600080fd5b506102276105a03660046138ab565b611be5565b3480156105b157600080fd5b506102276105c0366004613870565b611d4f565b3480156105d157600080fd5b506102276105e03660046135ef565b611f64565b6103446105f3366004613a6d565b6121ce565b34801561060457600080fd5b506102276106133660046138ab565b61277c565b34801561062457600080fd5b506008546102d19073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106749085908590613b7a565b9081526040519081900360200190205460ff1690509392505050565b610698612790565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106ea612790565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610745612790565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107776001612811565b565b60036020526000908152604090208054819061079490613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090613b8a565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509080600101805461082290613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613b8a565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905082565b60006108b2600583612935565b92915050565b6108c0612790565b6108ca8282612948565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610924612790565b61094573ffffffffffffffffffffffffffffffffffffffff84168383612aa2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a2090613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90613b8a565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b8a565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b59565b505050915250909392505050565b610bc4612790565b6001610bd1600584612935565b14610c10576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c208260025b60059190612b76565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c6890613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9490613b8a565b8015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b50505050508152602001600382018054610cfa90613b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690613b8a565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610df65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610da1565b5050505081525050905060005b816080015151811015610e8557610e7d8383608001518381518110610e2a57610e2a613bdd565b60200260200101516020015184608001518481518110610e4c57610e4c613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612aa29092919063ffffffff16565b600101610e03565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c07565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fdb612790565b60005b8181101561116e5760036000848484818110610ffc57610ffc613bdd565b905060200281019061100e9190613c0c565b61101c9060208101906135a4565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061105357611053613bdd565b90506020028101906110659190613c0c565b611073906020810190613c4a565b604051611081929190613b7a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110c8576110c8613bdd565b90506020028101906110da9190613c0c565b6110e8906020810190613c4a565b6040516110f6929190613b7a565b604051809103902083838381811061111057611110613bdd565b90506020028101906111229190613c0c565b6111309060208101906135a4565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610fde565b5060005b8381101561130d5760016003600087878581811061119257611192613bdd565b90506020028101906111a49190613c0c565b6111b29060208101906135a4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106111e9576111e9613bdd565b90506020028101906111fb9190613c0c565b611209906020810190613c4a565b604051611217929190613b7a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061126757611267613bdd565b90506020028101906112799190613c0c565b611287906020810190613c4a565b604051611295929190613b7a565b60405180910390208585838181106112af576112af613bdd565b90506020028101906112c19190613c0c565b6112cf9060208101906135a4565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611172565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611367576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c07565b61137760408201602083016135a4565b67ffffffffffffffff811660009081526003602052604090208054819061139d90613b8a565b90506000036113e4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611420908690600401613db1565b600060405180830381600087803b15801561143a57600080fd5b505af192505050801561144b575060015b6114eb573d808015611479576040519150601f19603f3d011682016040523d82523d6000602084013e61147e565b606091505b5061148b84356001610c17565b508335600090815260046020526040902084906114a88282614183565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906114dd908490613591565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611525612790565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906115de908261427d565b5050565b6115ea612790565b60005b818110156115185782828281811061160757611607613bdd565b90506020028101906116199190614397565b61162a906040810190602001613506565b6116f6576003600084848481811061164457611644613bdd565b90506020028101906116569190614397565b6116649060208101906135a4565b67ffffffffffffffff168152602081019190915260400160009081206116899161340f565b82828281811061169b5761169b613bdd565b90506020028101906116ad9190614397565b6116bb9060208101906135a4565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261196b565b82828281811061170857611708613bdd565b905060200281019061171a9190614397565b611728906040810190613c4a565b9050600003611763576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061177b5761177b613bdd565b905060200281019061178d9190614397565b61179b9060208101906135a4565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106117d1576117d1613bdd565b90506020028101906117e39190614397565b6117f1906040810190613c4a565b82916117fe919083613f07565b5083838381811061181157611811613bdd565b90506020028101906118239190614397565b611831906060810190613c4a565b15905061187c5783838381811061184a5761184a613bdd565b905060200281019061185c9190614397565b61186a906060810190613c4a565b600183019161187a919083613f07565b505b83838381811061188e5761188e613bdd565b90506020028101906118a09190614397565b6118ae906040810190613c4a565b6040516118bc929190613b7a565b60405180910390208484848181106118d6576118d6613bdd565b90506020028101906118e89190614397565b6118f69060208101906135a4565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061193357611933613bdd565b90506020028101906119459190614397565b611953906060810190613c4a565b6040516119619291906143cb565b60405180910390a3505b6001016115ed565b61197b612790565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a6c916143df565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611518908261427d565b611b21612790565b73ffffffffffffffffffffffffffffffffffffffff8116611b6e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611bed612790565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c4e57611c4e611c2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b8b565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611cfb57611cfb611cbb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612d0d565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611d88576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d9860408201602083016135a4565b611da56040830183613c4a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611dfc92509050613b8a565b15905080611e525750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e3d91906143df565b9081526040519081900360200190205460ff16155b15611e8b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c079190613591565b611e9b60408401602085016135a4565b67ffffffffffffffff8116600090815260036020526040902080548190611ec190613b8a565b9050600003611f08576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6000611f176060870187613c4a565b810190611f2491906135ef565b60095490915074010000000000000000000000000000000000000000900460ff16611f5c57611f5c611f578260016143f1565b612811565b505050505050565b6001611f71600583612935565b14611fab576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c07565b611fb6816000610c17565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611ffe90613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90613b8a565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b5050505050815260200160038201805461209090613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546120bc90613b8a565b80156121095780601f106120de57610100808354040283529160200191612109565b820191906000526020600020905b8154815290600101906020018083116120ec57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561218c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612137565b5050505081525050905061219f81612e11565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906121f790613b8a565b905060000361223e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061226e90613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461229a90613b8a565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161234890613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461237490613b8a565b80156123c15780601f10612396576101008083540402835291602001916123c1565b820191906000526020600020905b8154815290600101906020018083116123a457829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90612428908b908690600401614404565b602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246991906144d1565b60085490915073ffffffffffffffffffffffffffffffffffffffff161580159061252257506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156124fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252091906144d1565b105b1561254c5760085461254c9073ffffffffffffffffffffffffffffffffffffffff16333084612e83565b60005b875181101561269f576125bf33308a848151811061256f5761256f613bdd565b6020026020010151602001518b858151811061258d5761258d613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e83909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106125ef576125ef613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126975760025488516126979173ffffffffffffffffffffffffffffffffffffffff16908a908490811061264857612648613bdd565b6020026020010151602001518a848151811061266657612666613bdd565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b8b9092919063ffffffff16565b60010161254f565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156126d25760006126d4565b825b8a856040518463ffffffff1660e01b81526004016126f3929190614404565b60206040518083038185885af1158015612711573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061273691906144d1565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161276991815260200190565b60405180910390a1505050509392505050565b612784612790565b61278d81612ee1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c07565b80600116600103612854576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612888565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161289d91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600854600080855260208501909352909350611518927401000000000000000000000000000000000000000090910467ffffffffffffffff169161292e565b60408051808201909152600080825260208201528152602001906001900390816129075790505b50836121ce565b60006129418383612fd6565b9392505050565b804710156129b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c07565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a0c576040519150601f19603f3d011682016040523d82523d6000602084013e612a11565b606091505b5050905080611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613060565b6000612b8384848461316c565b949350505050565b801580612c2b57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2991906144d1565b155b612cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af4565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da891906144d1565b612db291906143f1565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612e0b9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612af4565b50505050565b612e19612790565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e559084906004016136f4565b600060405180830381600087803b158015612e6f57600080fd5b505af115801561130d573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e0b9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612af4565b3373ffffffffffffffffffffffffffffffffffffffff821603612f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c07565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612ffa5750612ffa8484613189565b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c07565b60006130c2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131959092919063ffffffff16565b80519091501561151857808060200190518101906130e091906144ea565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c07565b60008281526002840160205260408120829055612b8384846131a4565b600061294183836131b0565b6060612b8384846000856131c8565b600061294183836132e1565b60008181526001830160205260408120541515612941565b60608247101561325a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c07565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161328391906143df565b60006040518083038185875af1925050503d80600081146132c0576040519150601f19603f3d011682016040523d82523d6000602084013e6132c5565b606091505b50915091506132d687838387613330565b979650505050505050565b6000818152600183016020526040812054613328575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b2565b5060006108b2565b606083156133c65782516000036133bf5773ffffffffffffffffffffffffffffffffffffffff85163b6133bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c07565b5081612b83565b612b8383838151156133db5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c079190613591565b50805461341b90613b8a565b6000825580601f1061342b575050565b601f01602090049060005260206000209081019061278d91905b808211156134595760008155600101613445565b5090565b67ffffffffffffffff8116811461278d57600080fd5b60008060006040848603121561348857600080fd5b83356134938161345d565b9250602084013567ffffffffffffffff808211156134b057600080fd5b818601915086601f8301126134c457600080fd5b8135818111156134d357600080fd5b8760208285010111156134e557600080fd5b6020830194508093505050509250925092565b801515811461278d57600080fd5b60006020828403121561351857600080fd5b8135612941816134f8565b60005b8381101561353e578181015183820152602001613526565b50506000910152565b6000815180845261355f816020860160208601613523565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129416020830184613547565b6000602082840312156135b657600080fd5b81356129418161345d565b6040815260006135d46040830185613547565b82810360208401526135e68185613547565b95945050505050565b60006020828403121561360157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461278d57600080fd5b6000806040838503121561363d57600080fd5b823561364881613608565b946020939093013593505050565b60008060006060848603121561366b57600080fd5b833561367681613608565b9250602084013561368681613608565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136e9578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136ac565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261372e60c0840182613547565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261376a8383613547565b925060808601519150808584030160a0860152506135e68282613697565b6000806040838503121561379b57600080fd5b8235915060208301356137ad81613608565b809150509250929050565b60008083601f8401126137ca57600080fd5b50813567ffffffffffffffff8111156137e257600080fd5b6020830191508360208260051b85010111156137fd57600080fd5b9250929050565b6000806000806040858703121561381a57600080fd5b843567ffffffffffffffff8082111561383257600080fd5b61383e888389016137b8565b9096509450602087013591508082111561385757600080fd5b50613864878288016137b8565b95989497509550505050565b60006020828403121561388257600080fd5b813567ffffffffffffffff81111561389957600080fd5b820160a0818503121561294157600080fd5b6000602082840312156138bd57600080fd5b813561294181613608565b600080602083850312156138db57600080fd5b823567ffffffffffffffff8111156138f257600080fd5b6138fe858286016137b8565b90969095509350505050565b6000806040838503121561391d57600080fd5b82356139288161345d565b915060208301356137ad81613608565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561398a5761398a613938565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139d7576139d7613938565b604052919050565b600082601f8301126139f057600080fd5b813567ffffffffffffffff811115613a0a57613a0a613938565b613a3b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613990565b818152846020838601011115613a5057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8257600080fd5b8335613a8d8161345d565b925060208481013567ffffffffffffffff80821115613aab57600080fd5b818701915087601f830112613abf57600080fd5b813581811115613ad157613ad1613938565b613adf848260051b01613990565b81815260069190911b8301840190848101908a831115613afe57600080fd5b938501935b82851015613b4a576040858c031215613b1c5760008081fd5b613b24613967565b8535613b2f81613608565b81528587013587820152825260409094019390850190613b03565b965050506040870135925080831115613b6257600080fd5b5050613b70868287016139df565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b9e57607f821691505b602082108103613bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c4057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c7f57600080fd5b83018035915067ffffffffffffffff821115613c9a57600080fd5b6020019150368190038213156137fd57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ce457600080fd5b830160208101925035905067ffffffffffffffff811115613d0457600080fd5b8036038213156137fd57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136e9578135613d7f81613608565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d6c565b602081528135602082015260006020830135613dcc8161345d565b67ffffffffffffffff8082166040850152613dea6040860186613caf565b925060a06060860152613e0160c086018483613d13565b925050613e116060860186613caf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e47858385613d13565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e8057600080fd5b60209288019283019235915083821115613e9957600080fd5b8160061b3603831315613eab57600080fd5b8685030160a08701526132d6848284613d5c565b601f821115611518576000816000526020600020601f850160051c81016020861015613ee85750805b601f850160051c820191505b81811015611f5c57828155600101613ef4565b67ffffffffffffffff831115613f1f57613f1f613938565b613f3383613f2d8354613b8a565b83613ebf565b6000601f841160018114613f855760008515613f4f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561130d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fd45786850135825560209485019460019092019101613fb4565b508682101561400f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561405b81613608565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140c1576140c1613938565b80548382558084101561414e5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410257614102614021565b808616861461411357614113614021565b5060008360005260206000208360011b81018760011b820191505b8082101561414957828255828483015560028201915061412e565b505050505b5060008181526020812083915b85811015611f5c5761416d8383614050565b604092909201916002919091019060010161415b565b813581556001810160208301356141998161345d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141d96040860186613c4a565b935091506141eb838360028701613f07565b6141f86060860186613c4a565b9350915061420a838360038701613f07565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424157600080fd5b91840191823591508082111561425657600080fd5b506020820191508060061b360382131561426f57600080fd5b612e0b8183600486016140a8565b815167ffffffffffffffff81111561429757614297613938565b6142ab816142a58454613b8a565b84613ebf565b602080601f8311600181146142fe57600084156142c85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f5c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561434b5788860151825594840194600190910190840161432c565b508582101561438757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c4057600080fd5b602081526000612b83602083018486613d13565b60008251613c40818460208701613523565b808201808211156108b2576108b2614021565b67ffffffffffffffff83168152604060208201526000825160a0604084015261443060e0840182613547565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261446c8383613547565b925060408601519150808584030160808601526144898383613697565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506144c78282613547565b9695505050505050565b6000602082840312156144e357600080fd5b5051919050565b6000602082840312156144fc57600080fd5b8151612941816134f856fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162004b6138038062004b618339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b61449780620006ca6000396000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063e4ca875411610064578063e4ca8754146105c5578063e89b4485146105e5578063f2fde38b146105f8578063ff2deec31461061857600080fd5b8063bee518a41461051a578063c851cc3214610565578063c89245d514610585578063cf6730f8146105a557600080fd5b80639fe74e26116100d15780639fe74e261461047f578063b0f479a11461049f578063b187bd26146104ca578063b5a11011146104fa57600080fd5b806385572ffb146104145780638da5cb5b146104345780639d2aede51461045f57600080fd5b80635075a9d4116101645780636939cd971161013e5780636939cd97146103925780636d62d633146103bf57806379ba5097146103df5780638462a2b9146103f457600080fd5b80635075a9d414610324578063536c6bfa146103525780635e35359e1461037257600080fd5b80631892b906116101a05780631892b906146102755780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630e958d6b146101d257806316c38b3c14610207578063181f5a771461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed3660046133ee565b610645565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004613481565b610690565b005b34801561023557600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e332e300000000000000000000000000000602082015290516101fe919061350c565b34801561028157600080fd5b5061022761029036600461351f565b6106e2565b3480156102a157600080fd5b5061022761073d565b3480156102b657600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b5061031661031136600461351f565b610779565b6040516101fe92919061353c565b34801561033057600080fd5b5061034461033f36600461356a565b6108a5565b6040519081526020016101fe565b34801561035e57600080fd5b5061022761036d3660046135a5565b6108b8565b34801561037e57600080fd5b5061022761038d3660046135d1565b61091c565b34801561039e57600080fd5b506103b26103ad36600461356a565b6109b1565b6040516101fe919061366f565b3480156103cb57600080fd5b506102276103da366004613703565b610bbc565b3480156103eb57600080fd5b50610227610ed6565b34801561040057600080fd5b5061022761040f36600461377f565b610fd3565b34801561042057600080fd5b5061022761042f3660046137eb565b611314565b34801561044057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561046b57600080fd5b5061022761047a366004613826565b61151d565b34801561048b57600080fd5b5061022761049a366004613843565b6115e2565b3480156104ab57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104d657600080fd5b5060095474010000000000000000000000000000000000000000900460ff166101f2565b34801561050657600080fd5b50610227610515366004613885565b611973565b34801561052657600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561057157600080fd5b50610227610580366004613826565b611b19565b34801561059157600080fd5b506102276105a0366004613826565b611be5565b3480156105b157600080fd5b506102276105c03660046137eb565b611d4f565b3480156105d157600080fd5b506102276105e036600461356a565b611ee5565b6103446105f33660046139e8565b61214f565b34801561060457600080fd5b50610227610613366004613826565b6126fd565b34801561062457600080fd5b506008546102d19073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106749085908590613af5565b9081526040519081900360200190205460ff1690509392505050565b610698612711565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106ea612711565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610745612711565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107776001612792565b565b60036020526000908152604090208054819061079490613b05565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090613b05565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509080600101805461082290613b05565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613b05565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905082565b60006108b26005836128b6565b92915050565b6108c0612711565b6108ca82826128c9565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610924612711565b61094573ffffffffffffffffffffffffffffffffffffffff84168383612a23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a2090613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90613b05565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b05565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b59565b505050915250909392505050565b610bc4612711565b6001610bd16005846128b6565b14610c10576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c208260025b60059190612af7565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c6890613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9490613b05565b8015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b50505050508152602001600382018054610cfa90613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690613b05565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610df65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610da1565b5050505081525050905060005b816080015151811015610e8557610e7d8383608001518381518110610e2a57610e2a613b58565b60200260200101516020015184608001518481518110610e4c57610e4c613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a239092919063ffffffff16565b600101610e03565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c07565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fdb612711565b60005b8181101561116e5760036000848484818110610ffc57610ffc613b58565b905060200281019061100e9190613b87565b61101c90602081019061351f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061105357611053613b58565b90506020028101906110659190613b87565b611073906020810190613bc5565b604051611081929190613af5565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110c8576110c8613b58565b90506020028101906110da9190613b87565b6110e8906020810190613bc5565b6040516110f6929190613af5565b604051809103902083838381811061111057611110613b58565b90506020028101906111229190613b87565b61113090602081019061351f565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610fde565b5060005b8381101561130d5760016003600087878581811061119257611192613b58565b90506020028101906111a49190613b87565b6111b290602081019061351f565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106111e9576111e9613b58565b90506020028101906111fb9190613b87565b611209906020810190613bc5565b604051611217929190613af5565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061126757611267613b58565b90506020028101906112799190613b87565b611287906020810190613bc5565b604051611295929190613af5565b60405180910390208585838181106112af576112af613b58565b90506020028101906112c19190613b87565b6112cf90602081019061351f565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611172565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611367576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c07565b611377604082016020830161351f565b67ffffffffffffffff811660009081526003602052604090208054819061139d90613b05565b90506000036113e4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611420908690600401613d2c565b600060405180830381600087803b15801561143a57600080fd5b505af192505050801561144b575060015b6114eb573d808015611479576040519150601f19603f3d011682016040523d82523d6000602084013e61147e565b606091505b5061148b84356001610c17565b508335600090815260046020526040902084906114a88282614106565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906114dd90849061350c565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611525612711565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906115de9082614200565b5050565b6115ea612711565b60005b818110156115185782828281811061160757611607613b58565b9050602002810190611619919061431a565b61162a906040810190602001613481565b6116f6576003600084848481811061164457611644613b58565b9050602002810190611656919061431a565b61166490602081019061351f565b67ffffffffffffffff168152602081019190915260400160009081206116899161338a565b82828281811061169b5761169b613b58565b90506020028101906116ad919061431a565b6116bb90602081019061351f565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261196b565b82828281811061170857611708613b58565b905060200281019061171a919061431a565b611728906040810190613bc5565b9050600003611763576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061177b5761177b613b58565b905060200281019061178d919061431a565b61179b90602081019061351f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106117d1576117d1613b58565b90506020028101906117e3919061431a565b6117f1906040810190613bc5565b82916117fe919083613e8a565b5083838381811061181157611811613b58565b9050602002810190611823919061431a565b611831906060810190613bc5565b15905061187c5783838381811061184a5761184a613b58565b905060200281019061185c919061431a565b61186a906060810190613bc5565b600183019161187a919083613e8a565b505b83838381811061188e5761188e613b58565b90506020028101906118a0919061431a565b6118ae906040810190613bc5565b6040516118bc929190613af5565b60405180910390208484848181106118d6576118d6613b58565b90506020028101906118e8919061431a565b6118f690602081019061351f565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061193357611933613b58565b9050602002810190611945919061431a565b611953906060810190613bc5565b60405161196192919061434e565b60405180910390a3505b6001016115ed565b61197b612711565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a6c91614362565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115189082614200565b611b21612711565b73ffffffffffffffffffffffffffffffffffffffff8116611b6e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611bed612711565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c4e57611c4e611c2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b0c565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611cfb57611cfb611cbb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c8e565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611d88576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d98604082016020830161351f565b611da56040830183613bc5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611dfc92509050613b05565b15905080611e525750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e3d9190614362565b9081526040519081900360200190205460ff16155b15611e8b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c07919061350c565b6000611e9a6060850185613bc5565b810190611ea7919061356a565b60095490915074010000000000000000000000000000000000000000900460ff16611edf57611edf611eda826001614374565b612792565b50505050565b6001611ef26005836128b6565b14611f2c576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c07565b611f37816000610c17565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611f7f90613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054611fab90613b05565b8015611ff85780601f10611fcd57610100808354040283529160200191611ff8565b820191906000526020600020905b815481529060010190602001808311611fdb57829003601f168201915b5050505050815260200160038201805461201190613b05565b80601f016020809104026020016040519081016040528092919081815260200182805461203d90613b05565b801561208a5780601f1061205f5761010080835404028352916020019161208a565b820191906000526020600020905b81548152906001019060200180831161206d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561210d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016120b8565b5050505081525050905061212081612d8c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061217890613b05565b90506000036121bf576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906121ef90613b05565b80601f016020809104026020016040519081016040528092919081815260200182805461221b90613b05565b80156122685780601f1061223d57610100808354040283529160200191612268565b820191906000526020600020905b81548152906001019060200180831161224b57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916122c990613b05565b80601f01602080910402602001604051908101604052809291908181526020018280546122f590613b05565b80156123425780601f1061231757610100808354040283529160200191612342565b820191906000526020600020905b81548152906001019060200180831161232557829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906123a9908b908690600401614387565b602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea9190614454565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906124a357506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561247d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a19190614454565b105b156124cd576008546124cd9073ffffffffffffffffffffffffffffffffffffffff16333084612dfe565b60005b87518110156126205761254033308a84815181106124f0576124f0613b58565b6020026020010151602001518b858151811061250e5761250e613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dfe909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061257057612570613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126185760025488516126189173ffffffffffffffffffffffffffffffffffffffff16908a90849081106125c9576125c9613b58565b6020026020010151602001518a84815181106125e7576125e7613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b0c9092919063ffffffff16565b6001016124d0565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612653576000612655565b825b8a856040518463ffffffff1660e01b8152600401612674929190614387565b60206040518083038185885af1158015612692573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126b79190614454565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516126ea91815260200190565b60405180910390a1505050509392505050565b612705612711565b61270e81612e5c565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c07565b806001166001036127d5576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612809565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161281e91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600854600080855260208501909352909350611518927401000000000000000000000000000000000000000090910467ffffffffffffffff16916128af565b60408051808201909152600080825260208201528152602001906001900390816128885790505b508361214f565b60006128c28383612f51565b9392505050565b80471015612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c07565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461298d576040519150601f19603f3d011682016040523d82523d6000602084013e612992565b606091505b5050905080611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612fdb565b6000612b048484846130e7565b949350505050565b801580612bac57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612baa9190614454565b155b612c38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a75565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d299190614454565b612d339190614374565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611edf9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a75565b612d94612711565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612dd090849060040161366f565b600060405180830381600087803b158015612dea57600080fd5b505af115801561130d573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611edf9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a75565b3373ffffffffffffffffffffffffffffffffffffffff821603612edb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c07565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612f755750612f758484613104565b6128c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c07565b600061303d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131109092919063ffffffff16565b805190915015611518578080602001905181019061305b919061446d565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c07565b60008281526002840160205260408120829055612b04848461311f565b60006128c2838361312b565b6060612b048484600085613143565b60006128c2838361325c565b600081815260018301602052604081205415156128c2565b6060824710156131d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c07565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131fe9190614362565b60006040518083038185875af1925050503d806000811461323b576040519150601f19603f3d011682016040523d82523d6000602084013e613240565b606091505b5091509150613251878383876132ab565b979650505050505050565b60008181526001830160205260408120546132a3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b2565b5060006108b2565b6060831561334157825160000361333a5773ffffffffffffffffffffffffffffffffffffffff85163b61333a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c07565b5081612b04565b612b0483838151156133565781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07919061350c565b50805461339690613b05565b6000825580601f106133a6575050565b601f01602090049060005260206000209081019061270e91905b808211156133d457600081556001016133c0565b5090565b67ffffffffffffffff8116811461270e57600080fd5b60008060006040848603121561340357600080fd5b833561340e816133d8565b9250602084013567ffffffffffffffff8082111561342b57600080fd5b818601915086601f83011261343f57600080fd5b81358181111561344e57600080fd5b87602082850101111561346057600080fd5b6020830194508093505050509250925092565b801515811461270e57600080fd5b60006020828403121561349357600080fd5b81356128c281613473565b60005b838110156134b95781810151838201526020016134a1565b50506000910152565b600081518084526134da81602086016020860161349e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006128c260208301846134c2565b60006020828403121561353157600080fd5b81356128c2816133d8565b60408152600061354f60408301856134c2565b828103602084015261356181856134c2565b95945050505050565b60006020828403121561357c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461270e57600080fd5b600080604083850312156135b857600080fd5b82356135c381613583565b946020939093013593505050565b6000806000606084860312156135e657600080fd5b83356135f181613583565b9250602084013561360181613583565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613664578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613627565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136a960c08401826134c2565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136e583836134c2565b925060808601519150808584030160a0860152506135618282613612565b6000806040838503121561371657600080fd5b82359150602083013561372881613583565b809150509250929050565b60008083601f84011261374557600080fd5b50813567ffffffffffffffff81111561375d57600080fd5b6020830191508360208260051b850101111561377857600080fd5b9250929050565b6000806000806040858703121561379557600080fd5b843567ffffffffffffffff808211156137ad57600080fd5b6137b988838901613733565b909650945060208701359150808211156137d257600080fd5b506137df87828801613733565b95989497509550505050565b6000602082840312156137fd57600080fd5b813567ffffffffffffffff81111561381457600080fd5b820160a081850312156128c257600080fd5b60006020828403121561383857600080fd5b81356128c281613583565b6000806020838503121561385657600080fd5b823567ffffffffffffffff81111561386d57600080fd5b61387985828601613733565b90969095509350505050565b6000806040838503121561389857600080fd5b82356138a3816133d8565b9150602083013561372881613583565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613905576139056138b3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613952576139526138b3565b604052919050565b600082601f83011261396b57600080fd5b813567ffffffffffffffff811115613985576139856138b3565b6139b660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161390b565b8181528460208386010111156139cb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156139fd57600080fd5b8335613a08816133d8565b925060208481013567ffffffffffffffff80821115613a2657600080fd5b818701915087601f830112613a3a57600080fd5b813581811115613a4c57613a4c6138b3565b613a5a848260051b0161390b565b81815260069190911b8301840190848101908a831115613a7957600080fd5b938501935b82851015613ac5576040858c031215613a975760008081fd5b613a9f6138e2565b8535613aaa81613583565b81528587013587820152825260409094019390850190613a7e565b965050506040870135925080831115613add57600080fd5b5050613aeb8682870161395a565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b1957607f821691505b602082108103613b52577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613bbb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bfa57600080fd5b83018035915067ffffffffffffffff821115613c1557600080fd5b60200191503681900382131561377857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5f57600080fd5b830160208101925035905067ffffffffffffffff811115613c7f57600080fd5b80360382131561377857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613664578135613cfa81613583565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613ce7565b602081528135602082015260006020830135613d47816133d8565b67ffffffffffffffff8082166040850152613d656040860186613c2a565b925060a06060860152613d7c60c086018483613c8e565b925050613d8c6060860186613c2a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613dc2858385613c8e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613dfb57600080fd5b60209288019283019235915083821115613e1457600080fd5b8160061b3603831315613e2657600080fd5b8685030160a0870152613251848284613cd7565b601f821115611518576000816000526020600020601f850160051c81016020861015613e635750805b601f850160051c820191505b81811015613e8257828155600101613e6f565b505050505050565b67ffffffffffffffff831115613ea257613ea26138b3565b613eb683613eb08354613b05565b83613e3a565b6000601f841160018114613f085760008515613ed25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561130d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f575786850135825560209485019460019092019101613f37565b5086821015613f92577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613fde81613583565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115614044576140446138b3565b8054838255808410156140d15760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461408557614085613fa4565b808616861461409657614096613fa4565b5060008360005260206000208360011b81018760011b820191505b808210156140cc5782825582848301556002820191506140b1565b505050505b5060008181526020812083915b85811015613e82576140f08383613fd3565b60409290920191600291909101906001016140de565b8135815560018101602083013561411c816133d8565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561415c6040860186613bc5565b9350915061416e838360028701613e8a565b61417b6060860186613bc5565b9350915061418d838360038701613e8a565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126141c457600080fd5b9184019182359150808211156141d957600080fd5b506020820191508060061b36038213156141f257600080fd5b611edf81836004860161402b565b815167ffffffffffffffff81111561421a5761421a6138b3565b61422e816142288454613b05565b84613e3a565b602080601f831160018114614281576000841561424b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142ce578886015182559484019460019091019084016142af565b508582101561430a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613bbb57600080fd5b602081526000612b04602083018486613c8e565b60008251613bbb81846020870161349e565b808201808211156108b2576108b2613fa4565b67ffffffffffffffff83168152604060208201526000825160a060408401526143b360e08401826134c2565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526143ef83836134c2565b9250604086015191508085840301608086015261440c8383613612565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061444a82826134c2565b9695505050505050565b60006020828403121561446657600080fd5b5051919050565b60006020828403121561447f57600080fd5b81516128c28161347356fea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI 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 1336ceafb0..3ec95d7c8f 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 @@ -57,7 +57,7 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620050f5380380620050f58339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600960156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b6149b180620007446000396000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e89b448511610064578063e89b44851461066e578063ef686d8e14610681578063f2fde38b146106a1578063ff2deec3146106c157600080fd5b8063c89245d5146105d0578063cf6730f8146105f0578063e4ca875414610610578063e6c725f51461063057600080fd5b8063b187bd26116100d1578063b187bd2614610515578063b5a1101114610545578063bee518a414610565578063c851cc32146105b057600080fd5b80638f491cba1461048a5780639d2aede5146104aa5780639fe74e26146104ca578063b0f479a1146104ea57600080fd5b8063536c6bfa1161017a57806379ba50971161014957806379ba50971461040a5780638462a2b91461041f57806385572ffb1461043f5780638da5cb5b1461045f57600080fd5b8063536c6bfa1461037d5780635e35359e1461039d5780636939cd97146103bd5780636d62d633146103ea57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635075a9d41461034f57600080fd5b80630e958d6b146101f357806316c38b3c14610228578063181f5a771461024a5780631892b906146102a057600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613895565b6106ee565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610248610243366004613928565b610739565b005b34801561025657600080fd5b506102936040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161021f91906139b3565b3480156102ac57600080fd5b506102486102bb3660046139c6565b61078b565b3480156102cc57600080fd5b506102486107e6565b3480156102e157600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c3660046139c6565b610822565b60405161021f9291906139e3565b34801561035b57600080fd5b5061036f61036a366004613a11565b61094e565b60405190815260200161021f565b34801561038957600080fd5b50610248610398366004613a4c565b610961565b3480156103a957600080fd5b506102486103b8366004613a78565b6109c5565b3480156103c957600080fd5b506103dd6103d8366004613a11565b610a5a565b60405161021f9190613b16565b3480156103f657600080fd5b50610248610405366004613baa565b610c65565b34801561041657600080fd5b50610248610f7f565b34801561042b57600080fd5b5061024861043a366004613c26565b61107c565b34801561044b57600080fd5b5061024861045a366004613c92565b6113bd565b34801561046b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049657600080fd5b506102486104a5366004613a11565b6115c6565b3480156104b657600080fd5b506102486104c5366004613ccd565b6117a1565b3480156104d657600080fd5b506102486104e5366004613cea565b611866565b3480156104f657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561052157600080fd5b5060095474010000000000000000000000000000000000000000900460ff16610213565b34801561055157600080fd5b50610248610560366004613d2c565b611bf7565b34801561057157600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105bc57600080fd5b506102486105cb366004613ccd565b611d9d565b3480156105dc57600080fd5b506102486105eb366004613ccd565b611e69565b3480156105fc57600080fd5b5061024861060b366004613c92565b611fd3565b34801561061c57600080fd5b5061024861062b366004613a11565b6121e8565b34801561063c57600080fd5b506009547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b61036f61067c366004613e8f565b612452565b34801561068d57600080fd5b5061024861069c366004613f9c565b612a00565b3480156106ad57600080fd5b506102486106bc366004613ccd565b612a89565b3480156106cd57600080fd5b506008546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061071d9085908590613fbf565b9081526040519081900360200190205460ff1690509392505050565b610741612a9a565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610793612a9a565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107ee612a9a565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556108206001612b1b565b565b60036020526000908152604090208054819061083d90613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613fcf565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050908060010180546108cb90613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613fcf565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905082565b600061095b600583612d57565b92915050565b610969612a9a565b6109738282612d6a565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109cd612a9a565b6109ee73ffffffffffffffffffffffffffffffffffffffff84168383612ec4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a4d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ac990613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610af590613fcf565b8015610b425780601f10610b1757610100808354040283529160200191610b42565b820191906000526020600020905b815481529060010190602001808311610b2557829003601f168201915b50505050508152602001600382018054610b5b90613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790613fcf565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c02565b505050915250909392505050565b610c6d612a9a565b6001610c7a600584612d57565b14610cb9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610cc98260025b60059190612f98565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610d1190613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90613fcf565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050508152602001600382018054610da390613fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613fcf565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e9f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e4a565b5050505081525050905060005b816080015151811015610f2e57610f268383608001518381518110610ed357610ed3614022565b60200260200101516020015184608001518481518110610ef557610ef5614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ec49092919063ffffffff16565b600101610eac565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610cb0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611084612a9a565b60005b8181101561121757600360008484848181106110a5576110a5614022565b90506020028101906110b79190614051565b6110c59060208101906139c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110fc576110fc614022565b905060200281019061110e9190614051565b61111c90602081019061408f565b60405161112a929190613fbf565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061117157611171614022565b90506020028101906111839190614051565b61119190602081019061408f565b60405161119f929190613fbf565b60405180910390208383838181106111b9576111b9614022565b90506020028101906111cb9190614051565b6111d99060208101906139c6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611087565b5060005b838110156113b65760016003600087878581811061123b5761123b614022565b905060200281019061124d9190614051565b61125b9060208101906139c6565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061129257611292614022565b90506020028101906112a49190614051565b6112b290602081019061408f565b6040516112c0929190613fbf565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061131057611310614022565b90506020028101906113229190614051565b61133090602081019061408f565b60405161133e929190613fbf565b604051809103902085858381811061135857611358614022565b905060200281019061136a9190614051565b6113789060208101906139c6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161121b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611410576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610cb0565b61142060408201602083016139c6565b67ffffffffffffffff811660009081526003602052604090208054819061144690613fcf565b905060000361148d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114c99086906004016141f6565b600060405180830381600087803b1580156114e357600080fd5b505af19250505080156114f4575060015b611594573d808015611522576040519150601f19603f3d011682016040523d82523d6000602084013e611527565b606091505b5061153484356001610cc0565b5083356000908152600460205260409020849061155182826145c8565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906115869084906139b3565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6009547501000000000000000000000000000000000000000000900460ff16158061160e57506009547501000000000000000000000000000000000000000000900460ff1681105b156116165750565b600954600190611642907501000000000000000000000000000000000000000000900460ff16836146c2565b1161179e5760025473ffffffffffffffffffffffffffffffffffffffff166008546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171591906146fd565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175c57600080fd5b505af1158015611770573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6117a9612a9a565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff16600090815260036020522090611862908261471a565b5050565b61186e612a9a565b60005b818110156115c15782828281811061188b5761188b614022565b905060200281019061189d9190614834565b6118ae906040810190602001613928565b61197a57600360008484848181106118c8576118c8614022565b90506020028101906118da9190614834565b6118e89060208101906139c6565b67ffffffffffffffff1681526020810191909152604001600090812061190d91613831565b82828281811061191f5761191f614022565b90506020028101906119319190614834565b61193f9060208101906139c6565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611bef565b82828281811061198c5761198c614022565b905060200281019061199e9190614834565b6119ac90604081019061408f565b90506000036119e7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106119ff576119ff614022565b9050602002810190611a119190614834565b611a1f9060208101906139c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611a5557611a55614022565b9050602002810190611a679190614834565b611a7590604081019061408f565b8291611a8291908361434c565b50838383818110611a9557611a95614022565b9050602002810190611aa79190614834565b611ab590606081019061408f565b159050611b0057838383818110611ace57611ace614022565b9050602002810190611ae09190614834565b611aee90606081019061408f565b6001830191611afe91908361434c565b505b838383818110611b1257611b12614022565b9050602002810190611b249190614834565b611b3290604081019061408f565b604051611b40929190613fbf565b6040518091039020848484818110611b5a57611b5a614022565b9050602002810190611b6c9190614834565b611b7a9060208101906139c6565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611bb757611bb7614022565b9050602002810190611bc99190614834565b611bd790606081019061408f565b604051611be5929190614868565b60405180910390a3505b600101611871565b611bff612a9a565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611cf09161487c565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115c1908261471a565b611da5612a9a565b73ffffffffffffffffffffffffffffffffffffffff8116611df2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611e71612a9a565b60085473ffffffffffffffffffffffffffffffffffffffff1615611ed257611ed2611eb160025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612fad565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611f7f57611f7f611f3f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61312f565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461200c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61201c60408201602083016139c6565b612029604083018361408f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061208092509050613fcf565b159050806120d65750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516120c1919061487c565b9081526040519081900360200190205460ff16155b1561210f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610cb091906139b3565b61211f60408401602085016139c6565b67ffffffffffffffff811660009081526003602052604090208054819061214590613fcf565b905060000361218c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b600061219b606087018761408f565b8101906121a89190613a11565b60095490915074010000000000000000000000000000000000000000900460ff166121e0576121e06121db82600161488e565b612b1b565b505050505050565b60016121f5600583612d57565b1461222f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610cb0565b61223a816000610cc0565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161228290613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546122ae90613fcf565b80156122fb5780601f106122d0576101008083540402835291602001916122fb565b820191906000526020600020905b8154815290600101906020018083116122de57829003601f168201915b5050505050815260200160038201805461231490613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461234090613fcf565b801561238d5780601f106123625761010080835404028352916020019161238d565b820191906000526020600020905b81548152906001019060200180831161237057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156124105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016123bb565b5050505081525050905061242381613233565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061247b90613fcf565b90506000036124c2576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906124f290613fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461251e90613fcf565b801561256b5780601f106125405761010080835404028352916020019161256b565b820191906000526020600020905b81548152906001019060200180831161254e57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916125cc90613fcf565b80601f01602080910402602001604051908101604052809291908181526020018280546125f890613fcf565b80156126455780601f1061261a57610100808354040283529160200191612645565b820191906000526020600020905b81548152906001019060200180831161262857829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906126ac908b9086906004016148a1565b602060405180830381865afa1580156126c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ed919061496e565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906127a657506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a4919061496e565b105b156127d0576008546127d09073ffffffffffffffffffffffffffffffffffffffff163330846132a5565b60005b87518110156129235761284333308a84815181106127f3576127f3614022565b6020026020010151602001518b858151811061281157612811614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166132a5909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061287357612873614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461291b57600254885161291b9173ffffffffffffffffffffffffffffffffffffffff16908a90849081106128cc576128cc614022565b6020026020010151602001518a84815181106128ea576128ea614022565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612fad9092919063ffffffff16565b6001016127d3565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612956576000612958565b825b8a856040518463ffffffff1660e01b81526004016129779291906148a1565b60206040518083038185885af1158015612995573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129ba919061496e565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516129ed91815260200190565b60405180910390a1505050509392505050565b612a08612a9a565b600980547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a91612a9a565b61179e81613303565b60005473ffffffffffffffffffffffffffffffffffffffff163314610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610cb0565b80600116600103612b5e576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b92565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612b9b816115c6565b6040805160a0810190915260095473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612bf391815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612c6d57816020015b6040805180820190915260008082526020820152815260200190600190039081612c465790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612cc460025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600860149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612d149291906148a1565b6020604051808303816000875af1158015612d33573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c1919061496e565b6000612d6383836133f8565b9392505050565b80471015612dd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cb0565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b50509050806115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613482565b6000612fa584848461358e565b949350505050565b80158061304d57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304b919061496e565b155b6130d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f16565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156131a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ca919061496e565b6131d4919061488e565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061322d9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612f16565b50505050565b61323b612a9a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890613277908490600401613b16565b600060405180830381600087803b15801561329157600080fd5b505af11580156113b6573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261322d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612f16565b3373ffffffffffffffffffffffffffffffffffffffff821603613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610cb0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061341c575061341c84846135ab565b612d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610cb0565b60006134e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135b79092919063ffffffff16565b8051909150156115c157808060200190518101906135029190614987565b6115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610cb0565b60008281526002840160205260408120829055612fa584846135c6565b6000612d6383836135d2565b6060612fa584846000856135ea565b6000612d638383613703565b60008181526001830160205260408120541515612d63565b60608247101561367c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610cb0565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136a5919061487c565b60006040518083038185875af1925050503d80600081146136e2576040519150601f19603f3d011682016040523d82523d6000602084013e6136e7565b606091505b50915091506136f887838387613752565b979650505050505050565b600081815260018301602052604081205461374a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561095b565b50600061095b565b606083156137e85782516000036137e15773ffffffffffffffffffffffffffffffffffffffff85163b6137e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cb0565b5081612fa5565b612fa583838151156137fd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb091906139b3565b50805461383d90613fcf565b6000825580601f1061384d575050565b601f01602090049060005260206000209081019061179e91905b8082111561387b5760008155600101613867565b5090565b67ffffffffffffffff8116811461179e57600080fd5b6000806000604084860312156138aa57600080fd5b83356138b58161387f565b9250602084013567ffffffffffffffff808211156138d257600080fd5b818601915086601f8301126138e657600080fd5b8135818111156138f557600080fd5b87602082850101111561390757600080fd5b6020830194508093505050509250925092565b801515811461179e57600080fd5b60006020828403121561393a57600080fd5b8135612d638161391a565b60005b83811015613960578181015183820152602001613948565b50506000910152565b60008151808452613981816020860160208601613945565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d636020830184613969565b6000602082840312156139d857600080fd5b8135612d638161387f565b6040815260006139f66040830185613969565b8281036020840152613a088185613969565b95945050505050565b600060208284031215613a2357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179e57600080fd5b60008060408385031215613a5f57600080fd5b8235613a6a81613a2a565b946020939093013593505050565b600080600060608486031215613a8d57600080fd5b8335613a9881613a2a565b92506020840135613aa881613a2a565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613b0b578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613ace565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613b5060c0840182613969565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613b8c8383613969565b925060808601519150808584030160a086015250613a088282613ab9565b60008060408385031215613bbd57600080fd5b823591506020830135613bcf81613a2a565b809150509250929050565b60008083601f840112613bec57600080fd5b50813567ffffffffffffffff811115613c0457600080fd5b6020830191508360208260051b8501011115613c1f57600080fd5b9250929050565b60008060008060408587031215613c3c57600080fd5b843567ffffffffffffffff80821115613c5457600080fd5b613c6088838901613bda565b90965094506020870135915080821115613c7957600080fd5b50613c8687828801613bda565b95989497509550505050565b600060208284031215613ca457600080fd5b813567ffffffffffffffff811115613cbb57600080fd5b820160a08185031215612d6357600080fd5b600060208284031215613cdf57600080fd5b8135612d6381613a2a565b60008060208385031215613cfd57600080fd5b823567ffffffffffffffff811115613d1457600080fd5b613d2085828601613bda565b90969095509350505050565b60008060408385031215613d3f57600080fd5b8235613d4a8161387f565b91506020830135613bcf81613a2a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613dac57613dac613d5a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613df957613df9613d5a565b604052919050565b600082601f830112613e1257600080fd5b813567ffffffffffffffff811115613e2c57613e2c613d5a565b613e5d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613db2565b818152846020838601011115613e7257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613ea457600080fd5b8335613eaf8161387f565b925060208481013567ffffffffffffffff80821115613ecd57600080fd5b818701915087601f830112613ee157600080fd5b813581811115613ef357613ef3613d5a565b613f01848260051b01613db2565b81815260069190911b8301840190848101908a831115613f2057600080fd5b938501935b82851015613f6c576040858c031215613f3e5760008081fd5b613f46613d89565b8535613f5181613a2a565b81528587013587820152825260409094019390850190613f25565b965050506040870135925080831115613f8457600080fd5b5050613f9286828701613e01565b9150509250925092565b600060208284031215613fae57600080fd5b813560ff81168114612d6357600080fd5b8183823760009101908152919050565b600181811c90821680613fe357607f821691505b60208210810361401c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261408557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140c457600080fd5b83018035915067ffffffffffffffff8211156140df57600080fd5b602001915036819003821315613c1f57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261412957600080fd5b830160208101925035905067ffffffffffffffff81111561414957600080fd5b803603821315613c1f57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613b0b5781356141c481613a2a565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016141b1565b6020815281356020820152600060208301356142118161387f565b67ffffffffffffffff808216604085015261422f60408601866140f4565b925060a0606086015261424660c086018483614158565b92505061425660608601866140f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261428c858385614158565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126142c557600080fd5b602092880192830192359150838211156142de57600080fd5b8160061b36038313156142f057600080fd5b8685030160a08701526136f88482846141a1565b601f8211156115c1576000816000526020600020601f850160051c8101602086101561432d5750805b601f850160051c820191505b818110156121e057828155600101614339565b67ffffffffffffffff83111561436457614364613d5a565b614378836143728354613fcf565b83614304565b6000601f8411600181146143ca57600085156143945750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556113b6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561441957868501358255602094850194600190920191016143f9565b5086821015614454577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356144a081613a2a565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561450657614506613d5a565b8054838255808410156145935760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461454757614547614466565b808616861461455857614558614466565b5060008360005260206000208360011b81018760011b820191505b8082101561458e578282558284830155600282019150614573565b505050505b5060008181526020812083915b858110156121e0576145b28383614495565b60409290920191600291909101906001016145a0565b813581556001810160208301356145de8161387f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561461e604086018661408f565b9350915061463083836002870161434c565b61463d606086018661408f565b9350915061464f83836003870161434c565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261468657600080fd5b91840191823591508082111561469b57600080fd5b506020820191508060061b36038213156146b457600080fd5b61322d8183600486016144ed565b6000826146f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561470f57600080fd5b8151612d6381613a2a565b815167ffffffffffffffff81111561473457614734613d5a565b614748816147428454613fcf565b84614304565b602080601f83116001811461479b57600084156147655750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556121e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147e8578886015182559484019460019091019084016147c9565b508582101561482457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261408557600080fd5b602081526000612fa5602083018486614158565b60008251614085818460208701613945565b8082018082111561095b5761095b614466565b67ffffffffffffffff83168152604060208201526000825160a060408401526148cd60e0840182613969565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526149098383613969565b925060408601519150808584030160808601526149268383613ab9565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149648282613969565b9695505050505050565b60006020828403121561498057600080fd5b5051919050565b60006020828403121561499957600080fd5b8151612d638161391a56fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162005078380380620050788339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600960156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b61493480620007446000396000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e89b448511610064578063e89b44851461066e578063ef686d8e14610681578063f2fde38b146106a1578063ff2deec3146106c157600080fd5b8063c89245d5146105d0578063cf6730f8146105f0578063e4ca875414610610578063e6c725f51461063057600080fd5b8063b187bd26116100d1578063b187bd2614610515578063b5a1101114610545578063bee518a414610565578063c851cc32146105b057600080fd5b80638f491cba1461048a5780639d2aede5146104aa5780639fe74e26146104ca578063b0f479a1146104ea57600080fd5b8063536c6bfa1161017a57806379ba50971161014957806379ba50971461040a5780638462a2b91461041f57806385572ffb1461043f5780638da5cb5b1461045f57600080fd5b8063536c6bfa1461037d5780635e35359e1461039d5780636939cd97146103bd5780636d62d633146103ea57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635075a9d41461034f57600080fd5b80630e958d6b146101f357806316c38b3c14610228578063181f5a771461024a5780631892b906146102a057600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613810565b6106ee565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b506102486102433660046138a3565b610739565b005b34801561025657600080fd5b506102936040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161021f919061392e565b3480156102ac57600080fd5b506102486102bb366004613941565b61078b565b3480156102cc57600080fd5b506102486107e6565b3480156102e157600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c366004613941565b610822565b60405161021f92919061395e565b34801561035b57600080fd5b5061036f61036a36600461398c565b61094e565b60405190815260200161021f565b34801561038957600080fd5b506102486103983660046139c7565b610961565b3480156103a957600080fd5b506102486103b83660046139f3565b6109c5565b3480156103c957600080fd5b506103dd6103d836600461398c565b610a5a565b60405161021f9190613a91565b3480156103f657600080fd5b50610248610405366004613b25565b610c65565b34801561041657600080fd5b50610248610f7f565b34801561042b57600080fd5b5061024861043a366004613ba1565b61107c565b34801561044b57600080fd5b5061024861045a366004613c0d565b6113bd565b34801561046b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049657600080fd5b506102486104a536600461398c565b6115c6565b3480156104b657600080fd5b506102486104c5366004613c48565b6117a1565b3480156104d657600080fd5b506102486104e5366004613c65565b611866565b3480156104f657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561052157600080fd5b5060095474010000000000000000000000000000000000000000900460ff16610213565b34801561055157600080fd5b50610248610560366004613ca7565b611bf7565b34801561057157600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105bc57600080fd5b506102486105cb366004613c48565b611d9d565b3480156105dc57600080fd5b506102486105eb366004613c48565b611e69565b3480156105fc57600080fd5b5061024861060b366004613c0d565b611fd3565b34801561061c57600080fd5b5061024861062b36600461398c565b612169565b34801561063c57600080fd5b506009547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b61036f61067c366004613e0a565b6123d3565b34801561068d57600080fd5b5061024861069c366004613f17565b612981565b3480156106ad57600080fd5b506102486106bc366004613c48565b612a0a565b3480156106cd57600080fd5b506008546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061071d9085908590613f3a565b9081526040519081900360200190205460ff1690509392505050565b610741612a1b565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610793612a1b565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107ee612a1b565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556108206001612a9c565b565b60036020526000908152604090208054819061083d90613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613f4a565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050908060010180546108cb90613f4a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613f4a565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905082565b600061095b600583612cd8565b92915050565b610969612a1b565b6109738282612ceb565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109cd612a1b565b6109ee73ffffffffffffffffffffffffffffffffffffffff84168383612e45565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a4d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ac990613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610af590613f4a565b8015610b425780601f10610b1757610100808354040283529160200191610b42565b820191906000526020600020905b815481529060010190602001808311610b2557829003601f168201915b50505050508152602001600382018054610b5b90613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790613f4a565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c02565b505050915250909392505050565b610c6d612a1b565b6001610c7a600584612cd8565b14610cb9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610cc98260025b60059190612f19565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610d1190613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90613f4a565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050508152602001600382018054610da390613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613f4a565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e9f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e4a565b5050505081525050905060005b816080015151811015610f2e57610f268383608001518381518110610ed357610ed3613f9d565b60200260200101516020015184608001518481518110610ef557610ef5613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e459092919063ffffffff16565b600101610eac565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610cb0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611084612a1b565b60005b8181101561121757600360008484848181106110a5576110a5613f9d565b90506020028101906110b79190613fcc565b6110c5906020810190613941565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110fc576110fc613f9d565b905060200281019061110e9190613fcc565b61111c90602081019061400a565b60405161112a929190613f3a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061117157611171613f9d565b90506020028101906111839190613fcc565b61119190602081019061400a565b60405161119f929190613f3a565b60405180910390208383838181106111b9576111b9613f9d565b90506020028101906111cb9190613fcc565b6111d9906020810190613941565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611087565b5060005b838110156113b65760016003600087878581811061123b5761123b613f9d565b905060200281019061124d9190613fcc565b61125b906020810190613941565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061129257611292613f9d565b90506020028101906112a49190613fcc565b6112b290602081019061400a565b6040516112c0929190613f3a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061131057611310613f9d565b90506020028101906113229190613fcc565b61133090602081019061400a565b60405161133e929190613f3a565b604051809103902085858381811061135857611358613f9d565b905060200281019061136a9190613fcc565b611378906020810190613941565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161121b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611410576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610cb0565b6114206040820160208301613941565b67ffffffffffffffff811660009081526003602052604090208054819061144690613f4a565b905060000361148d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114c9908690600401614171565b600060405180830381600087803b1580156114e357600080fd5b505af19250505080156114f4575060015b611594573d808015611522576040519150601f19603f3d011682016040523d82523d6000602084013e611527565b606091505b5061153484356001610cc0565b50833560009081526004602052604090208490611551828261454b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061158690849061392e565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6009547501000000000000000000000000000000000000000000900460ff16158061160e57506009547501000000000000000000000000000000000000000000900460ff1681105b156116165750565b600954600190611642907501000000000000000000000000000000000000000000900460ff1683614645565b1161179e5760025473ffffffffffffffffffffffffffffffffffffffff166008546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117159190614680565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175c57600080fd5b505af1158015611770573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6117a9612a1b565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff16600090815260036020522090611862908261469d565b5050565b61186e612a1b565b60005b818110156115c15782828281811061188b5761188b613f9d565b905060200281019061189d91906147b7565b6118ae9060408101906020016138a3565b61197a57600360008484848181106118c8576118c8613f9d565b90506020028101906118da91906147b7565b6118e8906020810190613941565b67ffffffffffffffff1681526020810191909152604001600090812061190d916137ac565b82828281811061191f5761191f613f9d565b905060200281019061193191906147b7565b61193f906020810190613941565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611bef565b82828281811061198c5761198c613f9d565b905060200281019061199e91906147b7565b6119ac90604081019061400a565b90506000036119e7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106119ff576119ff613f9d565b9050602002810190611a1191906147b7565b611a1f906020810190613941565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611a5557611a55613f9d565b9050602002810190611a6791906147b7565b611a7590604081019061400a565b8291611a829190836142cf565b50838383818110611a9557611a95613f9d565b9050602002810190611aa791906147b7565b611ab590606081019061400a565b159050611b0057838383818110611ace57611ace613f9d565b9050602002810190611ae091906147b7565b611aee90606081019061400a565b6001830191611afe9190836142cf565b505b838383818110611b1257611b12613f9d565b9050602002810190611b2491906147b7565b611b3290604081019061400a565b604051611b40929190613f3a565b6040518091039020848484818110611b5a57611b5a613f9d565b9050602002810190611b6c91906147b7565b611b7a906020810190613941565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611bb757611bb7613f9d565b9050602002810190611bc991906147b7565b611bd790606081019061400a565b604051611be59291906147eb565b60405180910390a3505b600101611871565b611bff612a1b565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611cf0916147ff565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115c1908261469d565b611da5612a1b565b73ffffffffffffffffffffffffffffffffffffffff8116611df2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611e71612a1b565b60085473ffffffffffffffffffffffffffffffffffffffff1615611ed257611ed2611eb160025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612f2e565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611f7f57611f7f611f3f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6130b0565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461200c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61201c6040820160208301613941565b612029604083018361400a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061208092509050613f4a565b159050806120d65750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516120c191906147ff565b9081526040519081900360200190205460ff16155b1561210f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610cb0919061392e565b600061211e606085018561400a565b81019061212b919061398c565b60095490915074010000000000000000000000000000000000000000900460ff166121635761216361215e826001614811565b612a9c565b50505050565b6001612176600583612cd8565b146121b0576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610cb0565b6121bb816000610cc0565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161220390613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461222f90613f4a565b801561227c5780601f106122515761010080835404028352916020019161227c565b820191906000526020600020905b81548152906001019060200180831161225f57829003601f168201915b5050505050815260200160038201805461229590613f4a565b80601f01602080910402602001604051908101604052809291908181526020018280546122c190613f4a565b801561230e5780601f106122e35761010080835404028352916020019161230e565b820191906000526020600020905b8154815290600101906020018083116122f157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156123915760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161233c565b505050508152505090506123a4816131ae565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906123fc90613f4a565b9050600003612443576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061247390613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461249f90613f4a565b80156124ec5780601f106124c1576101008083540402835291602001916124ec565b820191906000526020600020905b8154815290600101906020018083116124cf57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161254d90613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461257990613f4a565b80156125c65780601f1061259b576101008083540402835291602001916125c6565b820191906000526020600020905b8154815290600101906020018083116125a957829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded9061262d908b908690600401614824565b602060405180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e91906148f1565b60085490915073ffffffffffffffffffffffffffffffffffffffff161580159061272757506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612701573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272591906148f1565b105b15612751576008546127519073ffffffffffffffffffffffffffffffffffffffff16333084613220565b60005b87518110156128a4576127c433308a848151811061277457612774613f9d565b6020026020010151602001518b858151811061279257612792613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16613220909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106127f4576127f4613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461289c57600254885161289c9173ffffffffffffffffffffffffffffffffffffffff16908a908490811061284d5761284d613f9d565b6020026020010151602001518a848151811061286b5761286b613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612f2e9092919063ffffffff16565b600101612754565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156128d75760006128d9565b825b8a856040518463ffffffff1660e01b81526004016128f8929190614824565b60206040518083038185885af1158015612916573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061293b91906148f1565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161296e91815260200190565b60405180910390a1505050509392505050565b612989612a1b565b600980547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a12612a1b565b61179e8161327e565b60005473ffffffffffffffffffffffffffffffffffffffff163314610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610cb0565b80600116600103612adf576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b13565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612b1c816115c6565b6040805160a0810190915260095473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612b7491815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612bee57816020015b6040805180820190915260008082526020820152815260200190600190039081612bc75790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612c4560025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600860149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612c95929190614824565b6020604051808303816000875af1158015612cb4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906148f1565b6000612ce48383613373565b9392505050565b80471015612d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cb0565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b50509050806115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526133fd565b6000612f26848484613509565b949350505050565b801580612fce57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcc91906148f1565b155b61305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612e97565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015613127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314b91906148f1565b6131559190614811565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506121639085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612e97565b6131b6612a1b565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906131f2908490600401613a91565b600060405180830381600087803b15801561320c57600080fd5b505af11580156113b6573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526121639085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612e97565b3373ffffffffffffffffffffffffffffffffffffffff8216036132fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610cb0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061339757506133978484613526565b612ce4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610cb0565b600061345f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135329092919063ffffffff16565b8051909150156115c1578080602001905181019061347d919061490a565b6115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610cb0565b60008281526002840160205260408120829055612f268484613541565b6000612ce4838361354d565b6060612f268484600085613565565b6000612ce4838361367e565b60008181526001830160205260408120541515612ce4565b6060824710156135f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610cb0565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161362091906147ff565b60006040518083038185875af1925050503d806000811461365d576040519150601f19603f3d011682016040523d82523d6000602084013e613662565b606091505b5091509150613673878383876136cd565b979650505050505050565b60008181526001830160205260408120546136c55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561095b565b50600061095b565b6060831561376357825160000361375c5773ffffffffffffffffffffffffffffffffffffffff85163b61375c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cb0565b5081612f26565b612f2683838151156137785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb0919061392e565b5080546137b890613f4a565b6000825580601f106137c8575050565b601f01602090049060005260206000209081019061179e91905b808211156137f657600081556001016137e2565b5090565b67ffffffffffffffff8116811461179e57600080fd5b60008060006040848603121561382557600080fd5b8335613830816137fa565b9250602084013567ffffffffffffffff8082111561384d57600080fd5b818601915086601f83011261386157600080fd5b81358181111561387057600080fd5b87602082850101111561388257600080fd5b6020830194508093505050509250925092565b801515811461179e57600080fd5b6000602082840312156138b557600080fd5b8135612ce481613895565b60005b838110156138db5781810151838201526020016138c3565b50506000910152565b600081518084526138fc8160208601602086016138c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612ce460208301846138e4565b60006020828403121561395357600080fd5b8135612ce4816137fa565b60408152600061397160408301856138e4565b828103602084015261398381856138e4565b95945050505050565b60006020828403121561399e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179e57600080fd5b600080604083850312156139da57600080fd5b82356139e5816139a5565b946020939093013593505050565b600080600060608486031215613a0857600080fd5b8335613a13816139a5565b92506020840135613a23816139a5565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613a86578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613a49565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613acb60c08401826138e4565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613b0783836138e4565b925060808601519150808584030160a0860152506139838282613a34565b60008060408385031215613b3857600080fd5b823591506020830135613b4a816139a5565b809150509250929050565b60008083601f840112613b6757600080fd5b50813567ffffffffffffffff811115613b7f57600080fd5b6020830191508360208260051b8501011115613b9a57600080fd5b9250929050565b60008060008060408587031215613bb757600080fd5b843567ffffffffffffffff80821115613bcf57600080fd5b613bdb88838901613b55565b90965094506020870135915080821115613bf457600080fd5b50613c0187828801613b55565b95989497509550505050565b600060208284031215613c1f57600080fd5b813567ffffffffffffffff811115613c3657600080fd5b820160a08185031215612ce457600080fd5b600060208284031215613c5a57600080fd5b8135612ce4816139a5565b60008060208385031215613c7857600080fd5b823567ffffffffffffffff811115613c8f57600080fd5b613c9b85828601613b55565b90969095509350505050565b60008060408385031215613cba57600080fd5b8235613cc5816137fa565b91506020830135613b4a816139a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613d2757613d27613cd5565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d7457613d74613cd5565b604052919050565b600082601f830112613d8d57600080fd5b813567ffffffffffffffff811115613da757613da7613cd5565b613dd860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613d2d565b818152846020838601011115613ded57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613e1f57600080fd5b8335613e2a816137fa565b925060208481013567ffffffffffffffff80821115613e4857600080fd5b818701915087601f830112613e5c57600080fd5b813581811115613e6e57613e6e613cd5565b613e7c848260051b01613d2d565b81815260069190911b8301840190848101908a831115613e9b57600080fd5b938501935b82851015613ee7576040858c031215613eb95760008081fd5b613ec1613d04565b8535613ecc816139a5565b81528587013587820152825260409094019390850190613ea0565b965050506040870135925080831115613eff57600080fd5b5050613f0d86828701613d7c565b9150509250925092565b600060208284031215613f2957600080fd5b813560ff81168114612ce457600080fd5b8183823760009101908152919050565b600181811c90821680613f5e57607f821691505b602082108103613f97577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261400057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261403f57600080fd5b83018035915067ffffffffffffffff82111561405a57600080fd5b602001915036819003821315613b9a57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140a457600080fd5b830160208101925035905067ffffffffffffffff8111156140c457600080fd5b803603821315613b9a57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613a8657813561413f816139a5565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161412c565b60208152813560208201526000602083013561418c816137fa565b67ffffffffffffffff80821660408501526141aa604086018661406f565b925060a060608601526141c160c0860184836140d3565b9250506141d1606086018661406f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526142078583856140d3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261424057600080fd5b6020928801928301923591508382111561425957600080fd5b8160061b360383131561426b57600080fd5b8685030160a087015261367384828461411c565b601f8211156115c1576000816000526020600020601f850160051c810160208610156142a85750805b601f850160051c820191505b818110156142c7578281556001016142b4565b505050505050565b67ffffffffffffffff8311156142e7576142e7613cd5565b6142fb836142f58354613f4a565b8361427f565b6000601f84116001811461434d57600085156143175750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556113b6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561439c578685013582556020948501946001909201910161437c565b50868210156143d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135614423816139a5565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561448957614489613cd5565b8054838255808410156145165760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146144ca576144ca6143e9565b80861686146144db576144db6143e9565b5060008360005260206000208360011b81018760011b820191505b808210156145115782825582848301556002820191506144f6565b505050505b5060008181526020812083915b858110156142c7576145358383614418565b6040929092019160029190910190600101614523565b81358155600181016020830135614561816137fa565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556145a1604086018661400a565b935091506145b38383600287016142cf565b6145c0606086018661400a565b935091506145d28383600387016142cf565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261460957600080fd5b91840191823591508082111561461e57600080fd5b506020820191508060061b360382131561463757600080fd5b612163818360048601614470565b60008261467b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561469257600080fd5b8151612ce4816139a5565b815167ffffffffffffffff8111156146b7576146b7613cd5565b6146cb816146c58454613f4a565b8461427f565b602080601f83116001811461471e57600084156146e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556142c7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561476b5788860151825594840194600190910190840161474c565b50858210156147a757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261400057600080fd5b602081526000612f266020830184866140d3565b600082516140008184602087016138c0565b8082018082111561095b5761095b6143e9565b67ffffffffffffffff83168152604060208201526000825160a0604084015261485060e08401826138e4565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261488c83836138e4565b925060408601519150808584030160808601526148a98383613a34565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506148e782826138e4565b9695505050505050565b60006020828403121561490357600080fd5b5051919050565b60006020828403121561491c57600080fd5b8151612ce48161389556fea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index ab34f1f8cf..58d249ef27 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 @@ -29,12 +29,12 @@ 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 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin b883c345ea43c1cfa7fcfd1bc8aeb3de8f75b41b2b4f5e2b4f1a33965831264b +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 78b23e61461e2ec590c7116955244d9f7f621c7712879e8b69583dcbb8ad0648 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 report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin ed68491cdc4c9a119682ab563a67705915f06599dd9de28516039d419904c896 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 63113c0443c4584873f959ef677f35fd0b365ad78b7497b79fb3d79a6c06abd3 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 62a0b8deea5606ff7c10b66b9dbaa50eb2a1034f Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 16 Jul 2024 13:14:05 -0400 Subject: [PATCH 47/61] gas optimizations and nitpick fixes --- contracts/gas-snapshots/ccip.gas-snapshot | 66 +++---- .../ccip/applications/external/CCIPBase.sol | 48 +++-- .../ccip/applications/external/CCIPClient.sol | 21 +- .../external/CCIPClientWithACK.sol | 37 +--- .../applications/external/CCIPReceiver.sol | 57 +++--- .../external/CCIPReceiverWithACK.sol | 12 +- .../ccip/applications/external/CCIPSender.sol | 9 +- .../internal/CCIPReceiverLegacy.sol | 59 ++++++ .../internal/EtherSenderReceiver.sol | 180 ++++++++++++++++++ .../applications/internal/PingPongDemo.sol | 23 +-- .../internal/SelfFundedPingPong.sol | 2 +- .../external/CCIPClientWithACKTest.t.sol | 2 +- .../external/CCIPReceiverTest.t.sol | 8 +- .../external/CCIPReceiverWithAckTest.t.sol | 2 +- .../internal/PingPongDemoTest.t.sol | 21 +- .../helpers/EtherSenderReceiverHelper.sol | 70 +------ .../helpers/receivers/CCIPReceiverBasic.sol | 6 +- 17 files changed, 357 insertions(+), 266 deletions(-) create mode 100644 contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol create mode 100644 contracts/src/v0.8/ccip/applications/internal/EtherSenderReceiver.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 6ee16f4622..a5fbdb2cef 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,16 +34,16 @@ 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_HappyPath_Success() (gas: 192504) +CCIPClientTest:test_HappyPath_Success() (gas: 192126) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326927) CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219968) CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376836) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) -CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331795) -CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438714) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 349366) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242666) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 553089) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331807) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 416038) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348558) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242678) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 553108) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -100,21 +100,21 @@ CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 12 CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1214264) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) CCIPReceiverTest:test_HappyPath_Success() (gas: 193794) -CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 430905) -CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 445121) -CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 199985) -CCIPReceiverTest:test_modifyRouter_Success() (gas: 26446) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 427653) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 454419) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20667) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 56278) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331829) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 438738) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2956788) -CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74867) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339615) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224489) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 368159) +CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 408968) +CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 414468) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 200263) +CCIPReceiverTest:test_modifyRouter_Success() (gas: 26449) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 405385) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423644) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20854) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 55404) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331763) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 416017) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2879800) +CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74845) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339353) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224534) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367897) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -219,7 +219,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181628) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190908) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48050) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1697359) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1587918) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 252012) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 174226) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193899) @@ -245,8 +245,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207956) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26001) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152913) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1768860) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3413460) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1659419) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3343871) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 210050) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210613) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 670625) @@ -397,7 +397,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: 1663435) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1553994) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159863) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175094) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248764) @@ -429,14 +429,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: 1744898) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1635457) 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: 3156679) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3087887) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144106) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -703,10 +703,10 @@ 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: 179093) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17917) -PingPong_example_plumbing:test_typeAndVersion() (gas: 9786) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203459) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 179111) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17833) +PingPong_example_plumbing:test_typeAndVersion() (gas: 9741) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203453) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -853,8 +853,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: 291110) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 445731) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 268794) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 445605) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) 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/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 6e6b52b91b..1c18da79f2 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -12,7 +12,7 @@ import {Address} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ut /// @dev This contract is abstract, but does not have any functions which must be implemented by a child. abstract contract CCIPBase is OwnerIsCreator { using SafeERC20 for IERC20; - using Address for address; + using Address for address payable; error ZeroAddressNotAllowed(); error InvalidRouter(address router); @@ -24,8 +24,10 @@ abstract contract CCIPBase is OwnerIsCreator { event TokensWithdrawnByOwner(address indexed token, address indexed to, uint256 amount); // Parameters are indexed to simplify indexing of cross-chain dapps where contracts may be deployed with the same address. - // Since the updateApprovedSenders() function should be used sparingly by the contract owner, the additional gas cost should be negligible. If this function is needed to be used constantly, or with a large number of - // contracts, then an alternative and more gas-efficient method should be implemented instead, e.g. with merkle trees or indexing the parameters can be removed. + // Since the updateApprovedSenders() function should be used sparingly by the contract owner, the additional gas cost + // should be negligible. If this function is needed to be used constantly, or with a large number of + // contracts, then an alternative and more gas-efficient method should be implemented instead, e.g. with merkle trees + // or removing the indexed parameters event ApprovedSenderAdded(uint64 indexed destChainSelector, bytes indexed recipient); event ApprovedSenderRemoved(uint64 indexed destChainSelector, bytes indexed recipient); @@ -108,7 +110,7 @@ abstract contract CCIPBase is OwnerIsCreator { return s_chainConfigs[sourceChainSelector].approvedSender[senderAddr]; } - // ================================================================ + // =============================================================== // │ Fee Token Management │ // =============================================================== @@ -116,17 +118,6 @@ abstract contract CCIPBase is OwnerIsCreator { /// @dev All the example applications accept prefunding. This function should be removed if prefunding in native fee token is not required. receive() external payable {} - /// @notice Allow the owner to recover any native-tokens sent to this contract out of error, or to withdraw any native-tokens which were used for pre-funding if the fee-token is switched away from native-tokens. - /// @dev Function should not be used to recover tokens from failed messages, abandonFailedMessage() should be used instead - /// @param to A payable address to send the recovered tokens to - /// @param amount the amount of native tokens to recover, denominated in wei - function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { - Address.sendValue(to, amount); - - // Use the same withdrawal event signature as withdrawTokens() but use address(0) to denote native-tokens. - emit TokensWithdrawnByOwner(address(0), to, amount); - } - /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error or withdraw any fee-tokens which were sent as a source of fee-token pre-funding /// @dev This should NOT be used for recovering tokens from a failed message. Token recoveries can happen only if /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. @@ -134,7 +125,11 @@ abstract contract CCIPBase is OwnerIsCreator { /// @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); + if (token == address(0)) { + payable(to).sendValue(amount); + } else { + IERC20(token).safeTransfer(to, amount); + } emit TokensWithdrawnByOwner(token, to, amount); } @@ -160,21 +155,23 @@ abstract contract CCIPBase is OwnerIsCreator { /// @notice Enable a remote-chain to send and receive messages to/from this contract via CCIP function applyChainUpdates(ChainUpdate[] calldata chains) external onlyOwner { for (uint256 i = 0; i < chains.length; ++i) { - if (!chains[i].allowed) { - delete s_chainConfigs[chains[i].chainSelector].recipient; - emit ChainRemoved(chains[i].chainSelector); + ChainUpdate memory chain = chains[i]; + + if (!chain.allowed) { + delete s_chainConfigs[chain.chainSelector].recipient; + emit ChainRemoved(chain.chainSelector); } else { // The existence of a stored recipient is used to denote a chain being enabled, so the length here cannot be zero - if (chains[i].recipient.length == 0) revert ZeroAddressNotAllowed(); + if (chain.recipient.length == 0) revert ZeroAddressNotAllowed(); - ChainConfig storage currentConfig = s_chainConfigs[chains[i].chainSelector]; + ChainConfig storage currentConfig = s_chainConfigs[chain.chainSelector]; - currentConfig.recipient = chains[i].recipient; + currentConfig.recipient = chain.recipient; // Set any additional args such as enabling out-of-order execution or manual gas-limit - if (chains[i].extraArgsBytes.length != 0) currentConfig.extraArgsBytes = chains[i].extraArgsBytes; + currentConfig.extraArgsBytes = chain.extraArgsBytes; - emit ChainAdded(chains[i].chainSelector, chains[i].recipient, chains[i].extraArgsBytes); + emit ChainAdded(chain.chainSelector, chain.recipient, chain.extraArgsBytes); } } } @@ -182,8 +179,7 @@ abstract contract CCIPBase is OwnerIsCreator { /// @notice Reverts if the specified chainSelector is not approved to send/receive messages to/from this contract /// @param chainSelector the CCIP specific chain selector for a given remote-chain. modifier isValidChain(uint64 chainSelector) { - // Must be storage and not memory because the struct contains a nested mapping which is not capable of being copied to memory - ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; + ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; // Must be storage because the nested mapping cannot be copied to memory if (currentConfig.recipient.length == 0) revert InvalidChain(chainSelector); _; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index f225a19808..9d2f82b7f3 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -20,6 +20,7 @@ contract CCIPClient is CCIPReceiver { event MessageSent(bytes32 messageId); event FeeTokenUpdated(address oldFeeToken, address newFeeToken); + /// @dev A check for the zero-address is not explicitly performed since it is included in the CCIPBase parent constructor constructor(address router, IERC20 feeToken) CCIPReceiver(router) { s_feeToken = feeToken; @@ -47,15 +48,16 @@ contract CCIPClient is CCIPReceiver { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken - // Fee transfers need first, that way balanceOf(address(this)) does not conflict with any tokens sent in tokenAmounts - // to support fee-token pre-funding + // To support pre-funding, if the contract already posesses enough tokens to pay the fee, then a transferFrom is + // not necesarry. This branch must be performed before transfering tokens in tokenAmounts[], since in the case + // where tokenAmounts[] contains the fee token, then balanceOf may double count tokens improperly and cause + // unexpected behavior. if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } for (uint256 i = 0; i < tokenAmounts.length; ++i) { - // Transfer the tokens to pay for tokens in tokenAmounts + // Transfer the tokens specified in TokenAmounts[] so that it can be forwarded to the router IERC20(tokenAmounts[i].token).safeTransferFrom(msg.sender, address(this), tokenAmounts[i].amount); // Do not approve the tokens if it is the feeToken, otherwise the approval amount may overflow @@ -75,17 +77,6 @@ contract CCIPClient is CCIPReceiver { return messageId; } - /// @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 - override - onlySelf - isValidSender(message.sourceChainSelector, message.sender) - isValidChain(message.sourceChainSelector) - {} - function updateFeeToken(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)) { diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index 9312760ed7..af882e582e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -10,7 +10,7 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// @title CCIPClientWithACK /// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. -/// @dev ccipSend functionality has been inherited from CCIPClient.sol, and _sendACK() from CCIPReceiverWithACK, so only processMessage() must be overridden to enable full functionality for processing incoming messages for ACKs +/// @dev ccipReceive functionality has been inherited fromCCIPReceiverWithACK, and so only ccipSend functionality must be implemented contract CCIPClientWithACK is CCIPReceiverWithACK { using SafeERC20 for IERC20; @@ -66,39 +66,4 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { return messageId; } - - /// @notice Implementation of arbitrary logic to be executed when a CCIP message is received - /// @dev is only invoked by self on CCIPReceive, and should implement arbitrary dapp-specific logic - function processMessage(Client.Any2EVMMessage calldata message) - external - virtual - override - onlySelf - isValidSender(message.sourceChainSelector, message.sender) - { - (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); - - if (payload.messageType == MessageType.OUTGOING) { - // Insert Processing workflow here. - - // If the message was outgoing, then send an ack response. - _sendAck(message); - } else if (payload.messageType == MessageType.ACK) { - // Decode message into the message-header and the messageId to ensure the message is encoded correctly - (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); - - // Ensure Ack Message contains proper message header - if (keccak256(abi.encode(messageHeader)) != keccak256(abi.encode(ACK_MESSAGE_HEADER))) { - revert InvalidAckMessageHeader(); - } - - // Make sure the ACK message was originally sent by this contract - if (s_messageStatus[messageId] != MessageStatus.SENT) revert CannotAcknowledgeUnsentMessage(messageId); - - // Mark the message has finalized from a proper ack-message. - s_messageStatus[messageId] = MessageStatus.ACKNOWLEDGED; - - emit MessageAckReceived(messageId); - } - } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index f2c81a87e0..71ca39b502 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -6,14 +6,14 @@ import {CCIPBase} from "./CCIPBase.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; -import {EnumerableMap} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; +import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; /// @title CCIPReceiver /// @notice This contract is capable of receiving incoming messages from the CCIP Router. /// @dev This contract implements various "defensive" measures to enhance security and efficiency. These include the ability to implement custom-retry logic and ownership-based token-recovery functions. contract CCIPReceiver is CCIPBase { using SafeERC20 for IERC20; - using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + using EnumerableSet for EnumerableSet.Bytes32Set; error OnlySelf(); error MessageNotFailed(bytes32 messageId); @@ -23,19 +23,11 @@ contract CCIPReceiver is CCIPBase { event MessageRecovered(bytes32 indexed messageId); event MessageAbandoned(bytes32 indexed messageId, address tokenReceiver); - enum ErrorCode { - RESOLVED, // RESOLVED is the default status for any incoming message, unless execution fails and it is marked as FAILED. - FAILED, // FAILED messages are messages which reverted during execution of processMessage() as part of the ccipReceive() try catch loop. - ABANDONED // ABANDONED messages are ones which cannot be properly processed, but any sent tokens are recoverable and - // can only be triggered by the contract owner. Only a message that was previously marked as FAILED can be abandoned. - - } - - // Failed messages are stored here. mapping(bytes32 messageId => Client.Any2EVMMessage contents) internal s_messageContents; - // Contains failed messages and their state. - EnumerableMap.Bytes32ToUintMap internal s_failedMessages; + // Contains the set of all messages in s_messageContents which failed to process properly. + // When a message is retried or abandoned it is removed from this set. + EnumerableSet.Bytes32Set internal s_failedMessages; constructor(address router) CCIPBase(router) {} @@ -55,12 +47,10 @@ contract CCIPReceiver is CCIPBase { { try this.processMessage(message) {} catch (bytes memory err) { - // If custom retry logic is desired, plus granting the owner the ability to extract tokens as a last resort for recovery, use this try-catch pattern in ccipReceiver. - // This make the message appear as a success to CCIP, and actual message state and any residual errors can be tracked within the dapp with greater granularity. - // If custom retry logic and token recovery functions are not needed, then this try-catch can be removed, - // and ccip manualExecution can be used a retry function instead. - - s_failedMessages.set(message.messageId, uint256(ErrorCode.FAILED)); + // If custom retry logic is desired, plus granting the owner the ability to extract tokens as a last resort for + // recovery, use this try-catch pattern in ccipReceiver. It will make the message appear as a success to CCIP, and + // actual message state and any residual errors can be tracked within the dapp. + s_failedMessages.add(message.messageId); // Store the message contents in case it needs to be retried or abandoned s_messageContents[message.messageId] = message; @@ -93,14 +83,15 @@ contract CCIPReceiver is CCIPBase { /// 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 multiple times. - s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); + if (!s_failedMessages.contains(messageId)) revert MessageNotFailed(messageId); // Allow developer to implement arbitrary functionality on retried messages, such as just releasing the associated tokens Client.Any2EVMMessage memory message = s_messageContents[messageId]; + // Set remove the message from storage to disallow reentry and retry the same failed message multiple times. + delete s_messageContents[messageId]; + s_failedMessages.remove(messageId); + // Allow the user override the implementation, since different workflow may be desired for retrying a message _retryFailedMessage(message); @@ -118,13 +109,16 @@ contract CCIPReceiver is CCIPBase { /// @dev function will send tokens to destination, but will NOT invoke any arbitrary logic afterwards. /// function is only callable by the contract owner function abandonFailedMessage(bytes32 messageId, address receiver) external onlyOwner { - if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) revert MessageNotFailed(messageId); + if (!s_failedMessages.contains(messageId)) revert MessageNotFailed(messageId); - s_failedMessages.set(messageId, uint256(ErrorCode.ABANDONED)); - Client.Any2EVMMessage memory message = s_messageContents[messageId]; + Client.EVMTokenAmount[] memory tokenAmounts = s_messageContents[messageId].destTokenAmounts; + + // Follow CEI and remove failed message from state before transferring in case of ERC-667 external calls + delete s_messageContents[messageId]; + s_failedMessages.remove(messageId); - for (uint256 i = 0; i < message.destTokenAmounts.length; ++i) { - IERC20(message.destTokenAmounts[i].token).safeTransfer(receiver, message.destTokenAmounts[i].amount); + for (uint256 i = 0; i < tokenAmounts.length; ++i) { + IERC20(tokenAmounts[i].token).safeTransfer(receiver, tokenAmounts[i].amount); } emit MessageAbandoned(messageId, receiver); @@ -140,9 +134,12 @@ contract CCIPReceiver is CCIPBase { return s_messageContents[messageId]; } + /// @notice Retrieve whether a message delivered by the CCIP router failed to process properly. + /// @dev Querying this function with message which was successfully retried or abandoned will return false /// @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); + /// @return bool Whether the previously-delivered message failed to process. + function isFailedMessage(bytes32 messageId) public view returns (bool) { + return s_failedMessages.contains(messageId); } modifier onlySelf() { diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 415e411939..1304f10091 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -93,16 +93,17 @@ contract CCIPReceiverWithACK is CCIPReceiver { // message type is a concept with ClientWithACK if (payload.messageType == MessageType.OUTGOING) { - // Insert processing workflow here. + _processIncomingMessage(message); // If the message was outgoing on the source chain, then send an ack response. _sendAck(message); + return; } else if (payload.messageType == MessageType.ACK) { // Decode message into the message header and the messageId to ensure the message is encoded correctly (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); // Ensure Ack Message contains proper message header. Must abi.encode() before hashing since its of the string type - if (keccak256(abi.encode(messageHeader)) != keccak256(abi.encode(ACK_MESSAGE_HEADER))) { + if (keccak256(bytes(messageHeader)) != keccak256(bytes(ACK_MESSAGE_HEADER))) { revert InvalidAckMessageHeader(); } @@ -116,15 +117,16 @@ contract CCIPReceiverWithACK is CCIPReceiver { } } + /// @notice Contains the arbitrary logic for processing incoming messages from an authorized sender & source-chain + function _processIncomingMessage(Client.Any2EVMMessage calldata incomingMessage) internal virtual {} + /// @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); - // 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), - tokenAmounts: tokenAmounts, + tokenAmounts: new Client.EVMTokenAmount[](0), 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 eb9dd54c38..ef21876490 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -9,7 +9,7 @@ import {CCIPBase} from "./CCIPBase.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; -/// @notice Example of a client which supports EVM/non-EVM chains +/// @notice Example of a client which supports sending messages to 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. @@ -25,9 +25,6 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; - error InvalidConfig(); - error InsufficientNativeFeeTokenAmount(); - event MessageSent(bytes32 messageId); event MessageReceived(bytes32 messageId); @@ -36,8 +33,8 @@ contract CCIPSender is CCIPBase { /// @notice sends a message through CCIP to the router function ccipSend( uint64 destChainSelector, - Client.EVMTokenAmount[] calldata tokenAmounts, - bytes calldata data, + Client.EVMTokenAmount[] memory tokenAmounts, + bytes memory data, address feeToken ) public payable isValidChain(destChainSelector) returns (bytes32 messageId) { Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ diff --git a/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol b/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol new file mode 100644 index 0000000000..a83f187612 --- /dev/null +++ b/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol @@ -0,0 +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); + _; + } +} diff --git a/contracts/src/v0.8/ccip/applications/internal/EtherSenderReceiver.sol b/contracts/src/v0.8/ccip/applications/internal/EtherSenderReceiver.sol new file mode 100644 index 0000000000..e569b6f59b --- /dev/null +++ b/contracts/src/v0.8/ccip/applications/internal/EtherSenderReceiver.sol @@ -0,0 +1,180 @@ +// 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 "./CCIPReceiverLegacy.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"; + +//solhint-disable interface-starts-with-i +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); + + 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/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 72a6b11cd2..3e31e0c557 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -24,7 +24,7 @@ contract PingPongDemo is CCIPClient { constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} function typeAndVersion() external pure virtual returns (string memory) { - return "PingPongDemo 1.3.0"; + return "PingPongDemo 1.6.0"; } function startPingPong() external onlyOwner { @@ -43,11 +43,7 @@ contract PingPongDemo is CCIPClient { bytes memory data = abi.encode(pingPongCount); - ccipSend({ - destChainSelector: s_counterpartChainSelector, // destChain - tokenAmounts: new Client.EVMTokenAmount[](0), - data: data - }); + ccipSend({destChainSelector: s_counterpartChainSelector, tokenAmounts: new Client.EVMTokenAmount[](0), data: data}); } /// @notice This function the entrypoint for this contract to process messages. @@ -61,9 +57,8 @@ contract PingPongDemo is CCIPClient { onlySelf isValidSender(message.sourceChainSelector, message.sender) { - uint256 pingPongCount = abi.decode(message.data, (uint256)); if (!s_isPaused) { - _respond(pingPongCount + 1); + _respond(abi.decode(message.data, (uint256)) + 1); } } @@ -72,6 +67,8 @@ contract PingPongDemo is CCIPClient { // ================================================================ function setCounterpart(uint64 counterpartChainSelector, address counterpartAddress) external onlyOwner { + if (counterpartAddress == address(0) || counterpartChainSelector == 0) revert ZeroAddressNotAllowed(); + s_counterpartChainSelector = counterpartChainSelector; s_counterpartAddress = counterpartAddress; @@ -82,16 +79,6 @@ contract PingPongDemo is CCIPClient { s_chainConfigs[counterpartChainSelector].recipient = abi.encode(counterpartAddress); } - function setCounterpartChainSelector(uint64 counterpartChainSelector) external onlyOwner { - s_counterpartChainSelector = counterpartChainSelector; - } - - function setCounterpartAddress(address counterpartAddress) external onlyOwner { - s_counterpartAddress = counterpartAddress; - - s_chainConfigs[s_counterpartChainSelector].recipient = abi.encode(counterpartAddress); - } - function setPaused(bool pause) external onlyOwner { s_isPaused = pause; } diff --git a/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol b/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol index 888e5aa361..4ff48c4f70 100644 --- a/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol +++ b/contracts/src/v0.8/ccip/applications/internal/SelfFundedPingPong.sol @@ -9,7 +9,7 @@ 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"; + string public constant override typeAndVersion = "SelfFundedPingPong 1.6.0"; event Funded(); event CountIncrBeforeFundingSet(uint8 countIncrBeforeFunding); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index a2f2ba645c..20c4611e5c 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -74,7 +74,7 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { ); // Check that message status is failed - assertEq(s_sender.getMessageStatus(messageId), 1); + assertTrue(s_sender.isFailedMessage(messageId), "Message Should be marked as failed"); } function test_ccipReceiveAndSendAck_Success() 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 ec99aed57c..bc4a396d96 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 @@ -129,7 +129,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { assertEq(failedMessage.destTokenAmounts[0].amount, amount); // Check that message status is failed - assertEq(s_receiver.getMessageStatus(messageId), 1); + assertTrue(s_receiver.isFailedMessage(messageId), "Message should be marked as failed"); uint256 tokenBalanceBefore = IERC20(token).balanceOf(OWNER); @@ -182,7 +182,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { assertEq(failedMessage.destTokenAmounts[0].amount, amount); // Check that message status is failed - assertEq(s_receiver.getMessageStatus(messageId), 1); + assertTrue(s_receiver.isFailedMessage(messageId), "Message should be marked as failed"); vm.startPrank(OWNER); @@ -198,7 +198,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { emit CCIPReceiver.MessageRecovered(messageId); s_receiver.retryFailedMessage(messageId); - assertEq(s_receiver.getMessageStatus(messageId), 0); + assertFalse(s_receiver.isFailedMessage(messageId), "Message should be marked as resolved"); } function test_HappyPath_Success() public { @@ -327,7 +327,7 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { vm.startPrank(OWNER); - s_receiver.withdrawNativeToken(payable(OWNER), amount); + s_receiver.withdrawTokens(address(0), payable(OWNER), amount); assertEq(OWNER.balance, balanceBefore + amount); } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPReceiverWithAckTest.t.sol index a5608814ea..b3ae03d496 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 @@ -150,7 +150,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { ); // Check that message status is failed - assertEq(s_receiver.getMessageStatus(messageId), 1); + assertTrue(s_receiver.isFailedMessage(messageId), "Message should be marked as failed"); } function test_modifyFeeToken_Success() public { diff --git a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol index 268680843a..fadbf2bb73 100644 --- a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol @@ -94,25 +94,6 @@ contract PingPong_example_ccipReceive is PingPongDappSetup { } 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()); @@ -122,6 +103,6 @@ contract PingPong_example_plumbing is PingPongDappSetup { } function test_typeAndVersion() public view { - assertEq(s_pingPong.typeAndVersion(), "PingPongDemo 1.3.0"); + assertEq(s_pingPong.typeAndVersion(), "PingPongDemo 1.6.0"); } } diff --git a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol index ab9f74d16d..88afa9ff73 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol @@ -1,35 +1,11 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; -import {CCIPSender} from "../../applications/external/CCIPSender.sol"; +import {EtherSenderReceiver} from "../../applications/internal/EtherSenderReceiver.sol"; import {Client} from "../../libraries/Client.sol"; -import {CCIPReceiverBasic} from "./receivers/CCIPReceiverBasic.sol"; -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; - - constructor(address router) CCIPSender(router) { - i_weth = IWrappedNative(CCIPRouter(router).getWrappedNative()); - IERC20(i_weth).safeApprove(router, type(uint256).max); - } +contract EtherSenderReceiverHelper is EtherSenderReceiver { + constructor(address router) EtherSenderReceiver(router) {} function validatedMessage(Client.EVM2AnyMessage calldata message) public view returns (Client.EVM2AnyMessage memory) { return _validatedMessage(message); @@ -39,47 +15,7 @@ contract EtherSenderReceiverHelper is CCIPSender { _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 validMessage = message; - - if (validMessage.tokenAmounts.length != 1) { - revert InvalidTokenAmounts(validMessage.tokenAmounts.length); - } - - validMessage.data = abi.encode(msg.sender); - validMessage.tokenAmounts[0].token = address(i_weth); - - return validMessage; - } - 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/CCIPReceiverBasic.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol index 7d7c54e89b..e331b9377c 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverBasic.sol @@ -3,17 +3,17 @@ 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 {CCIPBase} from "../../../applications/external/CCIPBase.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. contract CCIPReceiverBasic is CCIPBase, IAny2EVMMessageReceiver, IERC165 { constructor(address router) CCIPBase(router) {} function typeAndVersion() external pure virtual returns (string memory) { - return "CCIPReceiverBasic 1.0.0-dev"; + return "CCIPReceiverBasic 1.6.0-dev"; } /// @notice IERC165 supports an interfaceId From 730c44f1b15ef13b8d95fcdf2ef9c7f6fe75fe6b 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, 16 Jul 2024 17:23:46 +0000 Subject: [PATCH 48/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 66 +++++-------- .../ccipClientWithACK/ccipClientWithACK.go | 66 +++++-------- .../generated/ccipReceiver/ccipReceiver.go | 66 +++++-------- .../ccip/generated/ccipSender/ccipSender.go | 18 +--- .../ping_pong_demo/ping_pong_demo.go | 94 +++++-------------- .../self_funded_ping_pong.go | 94 +++++-------------- ...rapper-dependency-versions-do-not-edit.txt | 14 +-- 7 files changed, 139 insertions(+), 279 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 2d5a4f6d02..1490f0ca84 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620043de380380620043de8339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600880549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613d1880620006c66000396000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103fb578063f2fde38b1461040e578063ff2deec31461042e57600080fd5b8063cf6730f8146103bb578063e4ca8754146103db57600080fd5b8063b0f479a1116100a5578063b0f479a114610350578063c851cc321461037b578063c89245d51461039b57600080fd5b80638da5cb5b146102e45780639fe74e261461033057600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba50971461028f5780638462a2b9146102a457806385572ffb146102c457600080fd5b80636939cd97146102425780636d62d6331461026f57600080fd5b80635075a9d4116101485780635075a9d4146101d2578063536c6bfa146102005780635e35359e1461022257600080fd5b80630e958d6b1461016f57806335f170ef146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612db7565b61045b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004612e3c565b6104a6565b60405161019b929190612ec7565b3480156101de57600080fd5b506101f26101ed366004612ef5565b6105d2565b60405190815260200161019b565b34801561020c57600080fd5b5061022061021b366004612f30565b6105e5565b005b34801561022e57600080fd5b5061022061023d366004612f5c565b610649565b34801561024e57600080fd5b5061026261025d366004612ef5565b6106de565b60405161019b9190612ffa565b34801561027b57600080fd5b5061022061028a36600461308e565b6108e9565b34801561029b57600080fd5b50610220610c03565b3480156102b057600080fd5b506102206102bf36600461310a565b610d00565b3480156102d057600080fd5b506102206102df366004613176565b611041565b3480156102f057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561033c57600080fd5b5061022061034b3660046131b1565b61124a565b34801561035c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661030b565b34801561038757600080fd5b506102206103963660046131f3565b6115db565b3480156103a757600080fd5b506102206103b63660046131f3565b6116a7565b3480156103c757600080fd5b506102206103d6366004613176565b611811565b3480156103e757600080fd5b506102206103f6366004612ef5565b6119ca565b6101f2610409366004613345565b611c34565b34801561041a57600080fd5b506102206104293660046131f3565b6121e2565b34801561043a57600080fd5b5060085461030b9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061048a9085908590613452565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104c190613462565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed90613462565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b50505050509080600101805461054f90613462565b80601f016020809104026020016040519081016040528092919081815260200182805461057b90613462565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905082565b60006105df6005836121f6565b92915050565b6105ed612209565b6105f7828261228c565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610651612209565b61067273ffffffffffffffffffffffffffffffffffffffff841683836123e6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106d191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161074d90613462565b80601f016020809104026020016040519081016040528092919081815260200182805461077990613462565b80156107c65780601f1061079b576101008083540402835291602001916107c6565b820191906000526020600020905b8154815290600101906020018083116107a957829003601f168201915b505050505081526020016003820180546107df90613462565b80601f016020809104026020016040519081016040528092919081815260200182805461080b90613462565b80156108585780601f1061082d57610100808354040283529160200191610858565b820191906000526020600020905b81548152906001019060200180831161083b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108db5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610886565b505050915250909392505050565b6108f1612209565b60016108fe6005846121f6565b1461093d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61094d8260025b600591906124ba565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161099590613462565b80601f01602080910402602001604051908101604052809291908181526020018280546109c190613462565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b50505050508152602001600382018054610a2790613462565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5390613462565b8015610aa05780601f10610a7557610100808354040283529160200191610aa0565b820191906000526020600020905b815481529060010190602001808311610a8357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b235760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ace565b5050505081525050905060005b816080015151811015610bb257610baa8383608001518381518110610b5757610b576134b5565b60200260200101516020015184608001518481518110610b7957610b796134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123e69092919063ffffffff16565b600101610b30565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610934565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d08612209565b60005b81811015610e9b5760036000848484818110610d2957610d296134b5565b9050602002810190610d3b91906134e4565b610d49906020810190612e3c565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d8057610d806134b5565b9050602002810190610d9291906134e4565b610da0906020810190613522565b604051610dae929190613452565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610df557610df56134b5565b9050602002810190610e0791906134e4565b610e15906020810190613522565b604051610e23929190613452565b6040518091039020838383818110610e3d57610e3d6134b5565b9050602002810190610e4f91906134e4565b610e5d906020810190612e3c565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d0b565b5060005b8381101561103a57600160036000878785818110610ebf57610ebf6134b5565b9050602002810190610ed191906134e4565b610edf906020810190612e3c565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610f1657610f166134b5565b9050602002810190610f2891906134e4565b610f36906020810190613522565b604051610f44929190613452565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f9457610f946134b5565b9050602002810190610fa691906134e4565b610fb4906020810190613522565b604051610fc2929190613452565b6040518091039020858583818110610fdc57610fdc6134b5565b9050602002810190610fee91906134e4565b610ffc906020810190612e3c565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e9f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611094576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6110a46040820160208301612e3c565b67ffffffffffffffff81166000908152600360205260409020805481906110ca90613462565b9050600003611111576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061114d908690600401613689565b600060405180830381600087803b15801561116757600080fd5b505af1925050508015611178575060015b611218573d8080156111a6576040519150601f19603f3d011682016040523d82523d6000602084013e6111ab565b606091505b506111b884356001610944565b508335600090815260046020526040902084906111d58282613a63565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061120a908490613b5d565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611252612209565b60005b818110156112455782828281811061126f5761126f6134b5565b90506020028101906112819190613b70565b611292906040810190602001613bb2565b61135e57600360008484848181106112ac576112ac6134b5565b90506020028101906112be9190613b70565b6112cc906020810190612e3c565b67ffffffffffffffff168152602081019190915260400160009081206112f191612d53565b828282818110611303576113036134b5565b90506020028101906113159190613b70565b611323906020810190612e3c565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a26115d3565b828282818110611370576113706134b5565b90506020028101906113829190613b70565b611390906040810190613522565b90506000036113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106113e3576113e36134b5565b90506020028101906113f59190613b70565b611403906020810190612e3c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611439576114396134b5565b905060200281019061144b9190613b70565b611459906040810190613522565b82916114669190836137e7565b50838383818110611479576114796134b5565b905060200281019061148b9190613b70565b611499906060810190613522565b1590506114e4578383838181106114b2576114b26134b5565b90506020028101906114c49190613b70565b6114d2906060810190613522565b60018301916114e29190836137e7565b505b8383838181106114f6576114f66134b5565b90506020028101906115089190613b70565b611516906040810190613522565b604051611524929190613452565b604051809103902084848481811061153e5761153e6134b5565b90506020028101906115509190613b70565b61155e906020810190612e3c565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061159b5761159b6134b5565b90506020028101906115ad9190613b70565b6115bb906060810190613522565b6040516115c9929190613bcf565b60405180910390a3505b600101611255565b6115e3612209565b73ffffffffffffffffffffffffffffffffffffffff8116611630576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6116af612209565b60085473ffffffffffffffffffffffffffffffffffffffff1615611710576117106116ef60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff169060006124cf565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156117bd576117bd61177d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612651565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461184a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185a6040820160208301612e3c565b6118676040830183613522565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506118be92509050613462565b159050806119145750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516118ff9190613be3565b9081526040519081900360200190205460ff16155b1561194d57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109349190613b5d565b61195d6040840160208501612e3c565b67ffffffffffffffff811660009081526003602052604090208054819061198390613462565b905060000361103a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b60016119d76005836121f6565b14611a11576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610934565b611a1c816000610944565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611a6490613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9090613462565b8015611add5780601f10611ab257610100808354040283529160200191611add565b820191906000526020600020905b815481529060010190602001808311611ac057829003601f168201915b50505050508152602001600382018054611af690613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2290613462565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611bf25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611b9d565b50505050815250509050611c0581612755565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c5d90613462565b9050600003611ca4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610934565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611cd490613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0090613462565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611dae90613462565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda90613462565b8015611e275780601f10611dfc57610100808354040283529160200191611e27565b820191906000526020600020905b815481529060010190602001808311611e0a57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611e8e908b908690600401613bf5565b602060405180830381865afa158015611eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecf9190613cc2565b60085490915073ffffffffffffffffffffffffffffffffffffffff1615801590611f8857506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f869190613cc2565b105b15611fb257600854611fb29073ffffffffffffffffffffffffffffffffffffffff163330846127c7565b60005b87518110156121055761202533308a8481518110611fd557611fd56134b5565b6020026020010151602001518b8581518110611ff357611ff36134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127c7909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110612055576120556134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120fd5760025488516120fd9173ffffffffffffffffffffffffffffffffffffffff16908a90849081106120ae576120ae6134b5565b6020026020010151602001518a84815181106120cc576120cc6134b5565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124cf9092919063ffffffff16565b600101611fb5565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561213857600061213a565b825b8a856040518463ffffffff1660e01b8152600401612159929190613bf5565b60206040518083038185885af1158015612177573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061219c9190613cc2565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516121cf91815260200190565b60405180910390a1505050509392505050565b6121ea612209565b6121f381612825565b50565b6000612202838361291a565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610934565b565b804710156122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612350576040519150601f19603f3d011682016040523d82523d6000602084013e612355565b606091505b5050905080611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526129a4565b60006124c7848484612ab0565b949350505050565b80158061256f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190613cc2565b155b6125fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610934565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112459084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612438565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156126c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ec9190613cc2565b6126f69190613cdb565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061274f9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612438565b50505050565b61275d612209565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612799908490600401612ffa565b600060405180830381600087803b1580156127b357600080fd5b505af115801561103a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261274f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612438565b3373ffffffffffffffffffffffffffffffffffffffff8216036128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610934565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061293e575061293e8484612acd565b612202576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610934565b6000612a06826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ad99092919063ffffffff16565b8051909150156112455780806020019051810190612a249190613cee565b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610934565b600082815260028401602052604081208290556124c78484612ae8565b60006122028383612af4565b60606124c78484600085612b0c565b60006122028383612c25565b60008181526001830160205260408120541515612202565b606082471015612b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610934565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612bc79190613be3565b60006040518083038185875af1925050503d8060008114612c04576040519150601f19603f3d011682016040523d82523d6000602084013e612c09565b606091505b5091509150612c1a87838387612c74565b979650505050505050565b6000818152600183016020526040812054612c6c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105df565b5060006105df565b60608315612d0a578251600003612d035773ffffffffffffffffffffffffffffffffffffffff85163b612d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b50816124c7565b6124c78383815115612d1f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349190613b5d565b508054612d5f90613462565b6000825580601f10612d6f575050565b601f0160209004906000526020600020908101906121f391905b80821115612d9d5760008155600101612d89565b5090565b67ffffffffffffffff811681146121f357600080fd5b600080600060408486031215612dcc57600080fd5b8335612dd781612da1565b9250602084013567ffffffffffffffff80821115612df457600080fd5b818601915086601f830112612e0857600080fd5b813581811115612e1757600080fd5b876020828501011115612e2957600080fd5b6020830194508093505050509250925092565b600060208284031215612e4e57600080fd5b813561220281612da1565b60005b83811015612e74578181015183820152602001612e5c565b50506000910152565b60008151808452612e95816020860160208601612e59565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612eda6040830185612e7d565b8281036020840152612eec8185612e7d565b95945050505050565b600060208284031215612f0757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146121f357600080fd5b60008060408385031215612f4357600080fd5b8235612f4e81612f0e565b946020939093013593505050565b600080600060608486031215612f7157600080fd5b8335612f7c81612f0e565b92506020840135612f8c81612f0e565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612fef578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fb2565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303460c0840182612e7d565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130708383612e7d565b925060808601519150808584030160a086015250612eec8282612f9d565b600080604083850312156130a157600080fd5b8235915060208301356130b381612f0e565b809150509250929050565b60008083601f8401126130d057600080fd5b50813567ffffffffffffffff8111156130e857600080fd5b6020830191508360208260051b850101111561310357600080fd5b9250929050565b6000806000806040858703121561312057600080fd5b843567ffffffffffffffff8082111561313857600080fd5b613144888389016130be565b9096509450602087013591508082111561315d57600080fd5b5061316a878288016130be565b95989497509550505050565b60006020828403121561318857600080fd5b813567ffffffffffffffff81111561319f57600080fd5b820160a0818503121561220257600080fd5b600080602083850312156131c457600080fd5b823567ffffffffffffffff8111156131db57600080fd5b6131e7858286016130be565b90969095509350505050565b60006020828403121561320557600080fd5b813561220281612f0e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561326257613262613210565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132af576132af613210565b604052919050565b600082601f8301126132c857600080fd5b813567ffffffffffffffff8111156132e2576132e2613210565b61331360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613268565b81815284602083860101111561332857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561335a57600080fd5b833561336581612da1565b925060208481013567ffffffffffffffff8082111561338357600080fd5b818701915087601f83011261339757600080fd5b8135818111156133a9576133a9613210565b6133b7848260051b01613268565b81815260069190911b8301840190848101908a8311156133d657600080fd5b938501935b82851015613422576040858c0312156133f45760008081fd5b6133fc61323f565b853561340781612f0e565b815285870135878201528252604090940193908501906133db565b96505050604087013592508083111561343a57600080fd5b5050613448868287016132b7565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061347657607f821691505b6020821081036134af577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261351857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261355757600080fd5b83018035915067ffffffffffffffff82111561357257600080fd5b60200191503681900382131561310357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126135bc57600080fd5b830160208101925035905067ffffffffffffffff8111156135dc57600080fd5b80360382131561310357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612fef57813561365781612f0e565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613644565b6020815281356020820152600060208301356136a481612da1565b67ffffffffffffffff80821660408501526136c26040860186613587565b925060a060608601526136d960c0860184836135eb565b9250506136e96060860186613587565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261371f8583856135eb565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261375857600080fd5b6020928801928301923591508382111561377157600080fd5b8160061b360383131561378357600080fd5b8685030160a0870152612c1a848284613634565b601f821115611245576000816000526020600020601f850160051c810160208610156137c05750805b601f850160051c820191505b818110156137df578281556001016137cc565b505050505050565b67ffffffffffffffff8311156137ff576137ff613210565b6138138361380d8354613462565b83613797565b6000601f841160018114613865576000851561382f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561103a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156138b45786850135825560209485019460019092019101613894565b50868210156138ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561393b81612f0e565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156139a1576139a1613210565b805483825580841015613a2e5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146139e2576139e2613901565b80861686146139f3576139f3613901565b5060008360005260206000208360011b81018760011b820191505b80821015613a29578282558284830155600282019150613a0e565b505050505b5060008181526020812083915b858110156137df57613a4d8383613930565b6040929092019160029190910190600101613a3b565b81358155600181016020830135613a7981612da1565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ab96040860186613522565b93509150613acb8383600287016137e7565b613ad86060860186613522565b93509150613aea8383600387016137e7565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613b2157600080fd5b918401918235915080821115613b3657600080fd5b506020820191508060061b3603821315613b4f57600080fd5b61274f818360048601613988565b6020815260006122026020830184612e7d565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261351857600080fd5b80151581146121f357600080fd5b600060208284031215613bc457600080fd5b813561220281613ba4565b6020815260006124c76020830184866135eb565b60008251613518818460208701612e59565b67ffffffffffffffff83168152604060208201526000825160a06040840152613c2160e0840182612e7d565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613c5d8383612e7d565b92506040860151915080858403016080860152613c7a8383612f9d565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613cb88282612e7d565b9695505050505050565b600060208284031215613cd457600080fd5b5051919050565b808201808211156105df576105df613901565b600060208284031215613d0057600080fd5b815161220281613ba456fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620042b2380380620042b28339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600780549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613bec80620006c66000396000f3fe6080604052600436106101485760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103b2578063f2fde38b146103d3578063ff2deec3146103f357600080fd5b8063cf6730f814610372578063e4ca87541461039257600080fd5b8063b0f479a1116100a5578063b0f479a114610307578063c851cc3214610332578063c89245d51461035257600080fd5b80638da5cb5b1461029b5780639fe74e26146102e757600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba5097146102465780638462a2b91461025b57806385572ffb1461027b57600080fd5b80636939cd97146101f95780636d62d6331461022657600080fd5b80630a9094dc146101545780630e958d6b1461018957806335f170ef146101a95780635e35359e146101d757600080fd5b3661014f57005b600080fd5b34801561016057600080fd5b5061017461016f366004612ac5565b610420565b60405190151581526020015b60405180910390f35b34801561019557600080fd5b506101746101a4366004612af4565b610433565b3480156101b557600080fd5b506101c96101c4366004612b79565b61047e565b604051610180929190612c04565b3480156101e357600080fd5b506101f76101f2366004612c54565b6105aa565b005b34801561020557600080fd5b50610219610214366004612ac5565b61067f565b6040516101809190612cf2565b34801561023257600080fd5b506101f7610241366004612d86565b61088a565b34801561025257600080fd5b506101f7610aa1565b34801561026757600080fd5b506101f7610276366004612e02565b610b9e565b34801561028757600080fd5b506101f7610296366004612e6e565b610edf565b3480156102a757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610180565b3480156102f357600080fd5b506101f7610302366004612ea9565b6110e8565b34801561031357600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102c2565b34801561033e57600080fd5b506101f761034d366004612eeb565b611285565b34801561035e57600080fd5b506101f761036d366004612eeb565b611351565b34801561037e57600080fd5b506101f761038d366004612e6e565b6114bb565b34801561039e57600080fd5b506101f76103ad366004612ac5565b6115f7565b6103c56103c036600461303d565b6118c5565b604051908152602001610180565b3480156103df57600080fd5b506101f76103ee366004612eeb565b611e73565b3480156103ff57600080fd5b506007546102c29073ffffffffffffffffffffffffffffffffffffffff1681565b600061042d600583611e87565b92915050565b67ffffffffffffffff83166000908152600360205260408082209051600290910190610462908590859061314a565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104999061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546104c59061315a565b80156105125780601f106104e757610100808354040283529160200191610512565b820191906000526020600020905b8154815290600101906020018083116104f557829003601f168201915b5050505050908060010180546105279061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546105539061315a565b80156105a05780601f10610575576101008083540402835291602001916105a0565b820191906000526020600020905b81548152906001019060200180831161058357829003601f168201915b5050505050905082565b6105b2611ea2565b73ffffffffffffffffffffffffffffffffffffffff83166105f2576105ed73ffffffffffffffffffffffffffffffffffffffff831682611f25565b610613565b61061373ffffffffffffffffffffffffffffffffffffffff8416838361207f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161067291815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ee9061315a565b80601f016020809104026020016040519081016040528092919081815260200182805461071a9061315a565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b505050505081526020016003820180546107809061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac9061315a565b80156107f95780601f106107ce576101008083540402835291602001916107f9565b820191906000526020600020905b8154815290600101906020018083116107dc57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561087c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610827565b505050915250909392505050565b610892611ea2565b61089d600583611e87565b6108db576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561095c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610907565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506109ac6002830182612a13565b6109ba600383016000612a13565b6109c8600483016000612a4d565b506109d69050600584612153565b5060005b8151811015610a5057610a48838383815181106109f9576109f96131ad565b602002602001015160200151848481518110610a1757610a176131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661207f9092919063ffffffff16565b6001016109da565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108d2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ba6611ea2565b60005b81811015610d395760036000848484818110610bc757610bc76131ad565b9050602002810190610bd991906131dc565b610be7906020810190612b79565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c1e57610c1e6131ad565b9050602002810190610c3091906131dc565b610c3e90602081019061321a565b604051610c4c92919061314a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610c9357610c936131ad565b9050602002810190610ca591906131dc565b610cb390602081019061321a565b604051610cc192919061314a565b6040518091039020838383818110610cdb57610cdb6131ad565b9050602002810190610ced91906131dc565b610cfb906020810190612b79565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ba9565b5060005b83811015610ed857600160036000878785818110610d5d57610d5d6131ad565b9050602002810190610d6f91906131dc565b610d7d906020810190612b79565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610db457610db46131ad565b9050602002810190610dc691906131dc565b610dd490602081019061321a565b604051610de292919061314a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610e3257610e326131ad565b9050602002810190610e4491906131dc565b610e5290602081019061321a565b604051610e6092919061314a565b6040518091039020858583818110610e7a57610e7a6131ad565b9050602002810190610e8c91906131dc565b610e9a906020810190612b79565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610d3d565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610f32576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108d2565b610f426040820160208301612b79565b67ffffffffffffffff8116600090815260036020526040902080548190610f689061315a565b9050600003610faf576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108d2565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610feb908690600401613381565b600060405180830381600087803b15801561100557600080fd5b505af1925050508015611016575060015b6110b6573d808015611044576040519150601f19603f3d011682016040523d82523d6000602084013e611049565b606091505b506110566005853561215f565b50833560009081526004602052604090208490611073828261375b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110a8908490613855565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6110f0611ea2565b60005b818110156110e357600083838381811061110f5761110f6131ad565b90506020028101906111219190613868565b61112a906138aa565b9050806020015161119557805167ffffffffffffffff16600090815260036020526040812061115891612a13565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261127c565b8060400151516000036111d4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff1660009081526003602052604090819020908201518190611200908261395b565b5060608201516001820190611215908261395b565b5081604001516040516112289190613a75565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284606001516040516112729190613855565b60405180910390a3505b506001016110f3565b61128d611ea2565b73ffffffffffffffffffffffffffffffffffffffff81166112da576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611359611ea2565b60075473ffffffffffffffffffffffffffffffffffffffff16156113ba576113ba61139960025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1690600061216b565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156114675761146761142760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122ed565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b3330146114f4576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115046040820160208301612b79565b611511604083018361321a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506115689250905061315a565b159050806115be5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516115a99190613a75565b9081526040519081900360200190205460ff16155b156110e357806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108d29190613855565b611602600582611e87565b61163b576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108d2565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916116829061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546116ae9061315a565b80156116fb5780601f106116d0576101008083540402835291602001916116fb565b820191906000526020600020905b8154815290600101906020018083116116de57829003601f168201915b505050505081526020016003820180546117149061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546117409061315a565b801561178d5780601f106117625761010080835404028352916020019161178d565b820191906000526020600020905b81548152906001019060200180831161177057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016117bb565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506118626002830182612a13565b611870600383016000612a13565b61187e600483016000612a4d565b5061188c9050600583612153565b50611896816123f1565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906118ee9061315a565b9050600003611935576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108d2565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906119659061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546119919061315a565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611a3f9061315a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6b9061315a565b8015611ab85780601f10611a8d57610100808354040283529160200191611ab8565b820191906000526020600020905b815481529060010190602001808311611a9b57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611b1f908b908690600401613a87565b602060405180830381865afa158015611b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b609190613b54565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615801590611c1957506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c179190613b54565b105b15611c4357600754611c439073ffffffffffffffffffffffffffffffffffffffff16333084612463565b60005b8751811015611d9657611cb633308a8481518110611c6657611c666131ad565b6020026020010151602001518b8581518110611c8457611c846131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612463909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611ce657611ce66131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611d8e576002548851611d8e9173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611d3f57611d3f6131ad565b6020026020010151602001518a8481518110611d5d57611d5d6131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661216b9092919063ffffffff16565b600101611c46565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611dc9576000611dcb565b825b8a856040518463ffffffff1660e01b8152600401611dea929190613a87565b60206040518083038185885af1158015611e08573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e2d9190613b54565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611e6091815260200190565b60405180910390a1505050509392505050565b611e7b611ea2565b611e84816124c1565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108d2565b565b80471015611f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108d2565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fe9576040519150601f19603f3d011682016040523d82523d6000602084013e611fee565b606091505b50509050806110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108d2565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526110e39084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125b6565b6000611e9b83836126c2565b6000611e9b83836127b5565b80158061220b57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122099190613b54565b155b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108d2565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526110e39084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120d1565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123889190613b54565b6123929190613b6d565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506123eb9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120d1565b50505050565b6123f9611ea2565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612435908490600401612cf2565b600060405180830381600087803b15801561244f57600080fd5b505af1158015610ed8573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123eb9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016120d1565b3373ffffffffffffffffffffffffffffffffffffffff821603612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108d2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612618826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166128049092919063ffffffff16565b8051909150156110e357808060200190518101906126369190613b80565b6110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108d2565b600081815260018301602052604081205480156127ab5760006126e6600183613b9d565b85549091506000906126fa90600190613b9d565b905081811461275f57600086600001828154811061271a5761271a6131ad565b906000526020600020015490508087600001848154811061273d5761273d6131ad565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061277057612770613bb0565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042d565b600091505061042d565b60008181526001830160205260408120546127fc5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042d565b50600061042d565b6060612813848460008561281b565b949350505050565b6060824710156128ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108d2565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128d69190613a75565b60006040518083038185875af1925050503d8060008114612913576040519150601f19603f3d011682016040523d82523d6000602084013e612918565b606091505b509150915061292987838387612934565b979650505050505050565b606083156129ca5782516000036129c35773ffffffffffffffffffffffffffffffffffffffff85163b6129c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108d2565b5081612813565b61281383838151156129df5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29190613855565b508054612a1f9061315a565b6000825580601f10612a2f575050565b601f016020900490600052602060002090810190611e849190612a6e565b5080546000825560020290600052602060002090810190611e849190612a87565b5b80821115612a835760008155600101612a6f565b5090565b5b80821115612a835780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612a88565b600060208284031215612ad757600080fd5b5035919050565b67ffffffffffffffff81168114611e8457600080fd5b600080600060408486031215612b0957600080fd5b8335612b1481612ade565b9250602084013567ffffffffffffffff80821115612b3157600080fd5b818601915086601f830112612b4557600080fd5b813581811115612b5457600080fd5b876020828501011115612b6657600080fd5b6020830194508093505050509250925092565b600060208284031215612b8b57600080fd5b8135611e9b81612ade565b60005b83811015612bb1578181015183820152602001612b99565b50506000910152565b60008151808452612bd2816020860160208601612b96565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612c176040830185612bba565b8281036020840152612c298185612bba565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e8457600080fd5b600080600060608486031215612c6957600080fd5b8335612c7481612c32565b92506020840135612c8481612c32565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612ce7578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612caa565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612d2c60c0840182612bba565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d688383612bba565b925060808601519150808584030160a086015250612c298282612c95565b60008060408385031215612d9957600080fd5b823591506020830135612dab81612c32565b809150509250929050565b60008083601f840112612dc857600080fd5b50813567ffffffffffffffff811115612de057600080fd5b6020830191508360208260051b8501011115612dfb57600080fd5b9250929050565b60008060008060408587031215612e1857600080fd5b843567ffffffffffffffff80821115612e3057600080fd5b612e3c88838901612db6565b90965094506020870135915080821115612e5557600080fd5b50612e6287828801612db6565b95989497509550505050565b600060208284031215612e8057600080fd5b813567ffffffffffffffff811115612e9757600080fd5b820160a08185031215611e9b57600080fd5b60008060208385031215612ebc57600080fd5b823567ffffffffffffffff811115612ed357600080fd5b612edf85828601612db6565b90969095509350505050565b600060208284031215612efd57600080fd5b8135611e9b81612c32565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f5a57612f5a612f08565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fa757612fa7612f08565b604052919050565b600082601f830112612fc057600080fd5b813567ffffffffffffffff811115612fda57612fda612f08565b61300b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f60565b81815284602083860101111561302057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561305257600080fd5b833561305d81612ade565b925060208481013567ffffffffffffffff8082111561307b57600080fd5b818701915087601f83011261308f57600080fd5b8135818111156130a1576130a1612f08565b6130af848260051b01612f60565b81815260069190911b8301840190848101908a8311156130ce57600080fd5b938501935b8285101561311a576040858c0312156130ec5760008081fd5b6130f4612f37565b85356130ff81612c32565b815285870135878201528252604090940193908501906130d3565b96505050604087013592508083111561313257600080fd5b505061314086828701612faf565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061316e57607f821691505b6020821081036131a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261321057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261324f57600080fd5b83018035915067ffffffffffffffff82111561326a57600080fd5b602001915036819003821315612dfb57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132b457600080fd5b830160208101925035905067ffffffffffffffff8111156132d457600080fd5b803603821315612dfb57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612ce757813561334f81612c32565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161333c565b60208152813560208201526000602083013561339c81612ade565b67ffffffffffffffff80821660408501526133ba604086018661327f565b925060a060608601526133d160c0860184836132e3565b9250506133e1606086018661327f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526134178583856132e3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261345057600080fd5b6020928801928301923591508382111561346957600080fd5b8160061b360383131561347b57600080fd5b8685030160a087015261292984828461332c565b601f8211156110e3576000816000526020600020601f850160051c810160208610156134b85750805b601f850160051c820191505b818110156134d7578281556001016134c4565b505050505050565b67ffffffffffffffff8311156134f7576134f7612f08565b61350b83613505835461315a565b8361348f565b6000601f84116001811461355d57600085156135275750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610ed8565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135ac578685013582556020948501946001909201910161358c565b50868210156135e7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561363381612c32565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561369957613699612f08565b8054838255808410156137265760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146136da576136da6135f9565b80861686146136eb576136eb6135f9565b5060008360005260206000208360011b81018760011b820191505b80821015613721578282558284830155600282019150613706565b505050505b5060008181526020812083915b858110156134d7576137458383613628565b6040929092019160029190910190600101613733565b8135815560018101602083013561377181612ade565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556137b1604086018661321a565b935091506137c38383600287016134df565b6137d0606086018661321a565b935091506137e28383600387016134df565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261381957600080fd5b91840191823591508082111561382e57600080fd5b506020820191508060061b360382131561384757600080fd5b6123eb818360048601613680565b602081526000611e9b6020830184612bba565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261321057600080fd5b8015158114611e8457600080fd5b6000608082360312156138bc57600080fd5b6040516080810167ffffffffffffffff82821081831117156138e0576138e0612f08565b81604052843591506138f182612ade565b9082526020840135906139038261389c565b816020840152604085013591508082111561391d57600080fd5b61392936838701612faf565b6040840152606085013591508082111561394257600080fd5b5061394f36828601612faf565b60608301525092915050565b815167ffffffffffffffff81111561397557613975612f08565b61398981613983845461315a565b8461348f565b602080601f8311600181146139dc57600084156139a65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556134d7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613a2957888601518255948401946001909101908401613a0a565b5085821015613a6557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613210818460208701612b96565b67ffffffffffffffff83168152604060208201526000825160a06040840152613ab360e0840182612bba565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613aef8383612bba565b92506040860151915080858403016080860152613b0c8383612c95565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613b4a8282612bba565b9695505050505050565b600060208284031215613b6657600080fd5b5051919050565b8082018082111561042d5761042d6135f9565b600060208284031215613b9257600080fd5b8151611e9b8161389c565b8181038181111561042d5761042d6135f9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -218,28 +218,6 @@ func (_CCIPClient *CCIPClientCallerSession) GetMessageContents(messageId [32]byt 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") @@ -284,6 +262,28 @@ func (_CCIPClient *CCIPClientCallerSession) IsApprovedSender(sourceChainSelector return _CCIPClient.Contract.IsApprovedSender(&_CCIPClient.CallOpts, sourceChainSelector, senderAddr) } +func (_CCIPClient *CCIPClientCaller) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "isFailedMessage", messageId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPClient.Contract.IsFailedMessage(&_CCIPClient.CallOpts, messageId) +} + +func (_CCIPClient *CCIPClientCallerSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPClient.Contract.IsFailedMessage(&_CCIPClient.CallOpts, messageId) +} + func (_CCIPClient *CCIPClientCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _CCIPClient.contract.Call(opts, &out, "owner") @@ -490,18 +490,6 @@ func (_CCIPClient *CCIPClientTransactorSession) UpdateRouter(newRouter common.Ad return _CCIPClient.Contract.UpdateRouter(&_CCIPClient.TransactOpts, newRouter) } -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) } @@ -2456,12 +2444,12 @@ func (_CCIPClient *CCIPClient) Address() common.Address { type CCIPClientInterface 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) + IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) + Owner(opts *bind.CallOpts) (common.Address, error) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, @@ -2492,8 +2480,6 @@ type CCIPClientInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go index e422a70d4b..69bd9bf4af 100644 --- a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go +++ b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go @@ -56,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientWithACKMetaData = &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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004b8b38038062004b8b833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b6144ed806200069e6000396000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b4485146104a8578063f2fde38b146104bb578063ff2deec3146104db57600080fd5b8063c89245d514610448578063cf6730f814610468578063e4ca87541461048857600080fd5b80639fe74e26116100b05780639fe74e26146103dd578063b0f479a1146103fd578063c851cc321461042857600080fd5b806385572ffb146103715780638da5cb5b1461039157600080fd5b80635e35359e1161012d5780636fef519e116101075780636fef519e146102e657806379ba50971461033c5780638462a2b91461035157600080fd5b80635e35359e146102795780636939cd97146102995780636d62d633146102c657600080fd5b806335f170ef1161015e57806335f170ef146101fb5780635075a9d414610229578063536c6bfa1461025757600080fd5b806305bfe982146101855780630e958d6b146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a0366004613386565b60096020526000908152604090205460ff1681565b6040516101c291906133ce565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613425565b610508565b60405190151581526020016101c2565b34801561020757600080fd5b5061021b6102163660046134aa565b610553565b6040516101c2929190613535565b34801561023557600080fd5b50610249610244366004613386565b61067f565b6040519081526020016101c2565b34801561026357600080fd5b50610277610272366004613585565b610692565b005b34801561028557600080fd5b506102776102943660046135b1565b6106f6565b3480156102a557600080fd5b506102b96102b4366004613386565b61078b565b6040516101c2919061364f565b3480156102d257600080fd5b506102776102e13660046136e3565b610996565b3480156102f257600080fd5b5061032f6040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101c29190613713565b34801561034857600080fd5b50610277610cb0565b34801561035d57600080fd5b5061027761036c366004613772565b610dad565b34801561037d57600080fd5b5061027761038c3660046137de565b6110ee565b34801561039d57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103e957600080fd5b506102776103f8366004613819565b6112f7565b34801561040957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103b8565b34801561043457600080fd5b5061027761044336600461385b565b611688565b34801561045457600080fd5b5061027761046336600461385b565b611754565b34801561047457600080fd5b506102776104833660046137de565b6118c8565b34801561049457600080fd5b506102776104a3366004613386565b611c16565b6102496104b63660046139de565b611e80565b3480156104c757600080fd5b506102776104d636600461385b565b612457565b3480156104e757600080fd5b506008546103b89073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105379085908590613aeb565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061056e90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461059a90613afb565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b5050505050908060010180546105fc90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461062890613afb565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905082565b600061068c60058361246b565b92915050565b61069a61247e565b6106a48282612501565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6106fe61247e565b61071f73ffffffffffffffffffffffffffffffffffffffff8416838361265b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161077e91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107fa90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461082690613afb565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200160038201805461088c90613afb565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890613afb565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109885760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610933565b505050915250909392505050565b61099e61247e565b60016109ab60058461246b565b146109ea576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109fa8260025b6005919061272f565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610a4290613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90613afb565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b50505050508152602001600382018054610ad490613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090613afb565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bd05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b7b565b5050505081525050905060005b816080015151811015610c5f57610c578383608001518381518110610c0457610c04613b4e565b60200260200101516020015184608001518481518110610c2657610c26613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661265b9092919063ffffffff16565b600101610bdd565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109e1565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610db561247e565b60005b81811015610f485760036000848484818110610dd657610dd6613b4e565b9050602002810190610de89190613b7d565b610df69060208101906134aa565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e2d57610e2d613b4e565b9050602002810190610e3f9190613b7d565b610e4d906020810190613bbb565b604051610e5b929190613aeb565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ea257610ea2613b4e565b9050602002810190610eb49190613b7d565b610ec2906020810190613bbb565b604051610ed0929190613aeb565b6040518091039020838383818110610eea57610eea613b4e565b9050602002810190610efc9190613b7d565b610f0a9060208101906134aa565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610db8565b5060005b838110156110e757600160036000878785818110610f6c57610f6c613b4e565b9050602002810190610f7e9190613b7d565b610f8c9060208101906134aa565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fc357610fc3613b4e565b9050602002810190610fd59190613b7d565b610fe3906020810190613bbb565b604051610ff1929190613aeb565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061104157611041613b4e565b90506020028101906110539190613b7d565b611061906020810190613bbb565b60405161106f929190613aeb565b604051809103902085858381811061108957611089613b4e565b905060200281019061109b9190613b7d565b6110a99060208101906134aa565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f4c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611141576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109e1565b61115160408201602083016134aa565b67ffffffffffffffff811660009081526003602052604090208054819061117790613afb565b90506000036111be576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906111fa908690600401613d22565b600060405180830381600087803b15801561121457600080fd5b505af1925050508015611225575060015b6112c5573d808015611253576040519150601f19603f3d011682016040523d82523d6000602084013e611258565b606091505b50611265843560016109f1565b5083356000908152600460205260409020849061128282826140fc565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112b7908490613713565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6112ff61247e565b60005b818110156112f25782828281811061131c5761131c613b4e565b905060200281019061132e91906141f6565b61133f906040810190602001614238565b61140b576003600084848481811061135957611359613b4e565b905060200281019061136b91906141f6565b6113799060208101906134aa565b67ffffffffffffffff1681526020810191909152604001600090812061139e91613338565b8282828181106113b0576113b0613b4e565b90506020028101906113c291906141f6565b6113d09060208101906134aa565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611680565b82828281811061141d5761141d613b4e565b905060200281019061142f91906141f6565b61143d906040810190613bbb565b9050600003611478576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061149057611490613b4e565b90506020028101906114a291906141f6565b6114b09060208101906134aa565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106114e6576114e6613b4e565b90506020028101906114f891906141f6565b611506906040810190613bbb565b8291611513919083613e80565b5083838381811061152657611526613b4e565b905060200281019061153891906141f6565b611546906060810190613bbb565b1590506115915783838381811061155f5761155f613b4e565b905060200281019061157191906141f6565b61157f906060810190613bbb565b600183019161158f919083613e80565b505b8383838181106115a3576115a3613b4e565b90506020028101906115b591906141f6565b6115c3906040810190613bbb565b6040516115d1929190613aeb565b60405180910390208484848181106115eb576115eb613b4e565b90506020028101906115fd91906141f6565b61160b9060208101906134aa565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061164857611648613b4e565b905060200281019061165a91906141f6565b611668906060810190613bbb565b604051611676929190614255565b60405180910390a3505b600101611302565b61169061247e565b73ffffffffffffffffffffffffffffffffffffffff81166116dd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61175c61247e565b60085473ffffffffffffffffffffffffffffffffffffffff16156117bd576117bd61179c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612744565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561186a5761186a61182a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6128c6565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611901576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61191160408201602083016134aa565b61191e6040830183613bbb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061197592509050613afb565b159050806119cb5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516119b69190614269565b9081526040519081900360200190205460ff16155b15611a0457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109e19190613713565b6000611a136060850185613bbb565b810190611a20919061427b565b9050600081604001516001811115611a3a57611a3a61339f565b03611a4d57611a48846129c4565b611c10565b600181604001516001811115611a6557611a6561339f565b03611c10576000808260200151806020019051810190611a859190614327565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611acf9190613713565b6040516020818303038152906040528051906020012082604051602001611af69190613713565b6040516020818303038152906040528051906020012014611b43576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008281526009602052604090205460ff166002811115611b6857611b6861339f565b14611ba2576040517f3ec87700000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505b50505050565b6001611c2360058361246b565b14611c5d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109e1565b611c688160006109f1565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611cb090613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdc90613afb565b8015611d295780601f10611cfe57610100808354040283529160200191611d29565b820191906000526020600020905b815481529060010190602001808311611d0c57829003601f168201915b50505050508152602001600382018054611d4290613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6e90613afb565b8015611dbb5780601f10611d9057610100808354040283529160200191611dbb565b820191906000526020600020905b815481529060010190602001808311611d9e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e3e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611de9565b50505050815250509050611e5181612d3a565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ea990613afb565b9050600003611ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109e1565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611f2090613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4c90613afb565b8015611f995780601f10611f6e57610100808354040283529160200191611f99565b820191906000526020600020905b815481529060010190602001808311611f7c57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ffa90613afb565b80601f016020809104026020016040519081016040528092919081815260200182805461202690613afb565b80156120735780601f1061204857610100808354040283529160200191612073565b820191906000526020600020905b81548152906001019060200180831161205657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906120da908b9086906004016143a8565b602060405180830381865afa1580156120f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211b9190614475565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906121d457506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156121ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d29190614475565b105b156121fe576008546121fe9073ffffffffffffffffffffffffffffffffffffffff16333084612dac565b60005b87518110156123515761227133308a848151811061222157612221613b4e565b6020026020010151602001518b858151811061223f5761223f613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dac909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106122a1576122a1613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146123495760025488516123499173ffffffffffffffffffffffffffffffffffffffff16908a90849081106122fa576122fa613b4e565b6020026020010151602001518a848151811061231857612318613b4e565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127449092919063ffffffff16565b600101612201565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612384576000612386565b825b8a856040518463ffffffff1660e01b81526004016123a59291906143a8565b60206040518083038185885af11580156123c3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123e89190614475565b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61245f61247e565b61246881612e0a565b50565b60006124778383612eff565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109e1565b565b8047101561256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109e1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146125c5576040519150601f19603f3d011682016040523d82523d6000602084013e6125ca565b606091505b50509050806112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f89565b600061273c848484613095565b949350505050565b8015806127e457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e29190614475565b155b612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109e1565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112f29084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016126ad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561293d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129619190614475565b61296b919061448e565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611c109085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016126ad565b6040805160008082526020820190925281612a01565b60408051808201909152600080825260208201528152602001906001900390816129da5790505b50905060006040518060a00160405280848060400190612a219190613bbb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000602082810191909152915192820192612aa292883591016144a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff1683830152606090920191600391600091612b129189019089016134aa565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054612b4290613afb565b80601f0160208091040260200160405190810160405280929190818152602001828054612b6e90613afb565b8015612bbb5780601f10612b9057610100808354040283529160200191612bbb565b820191906000526020600020905b815481529060010190602001808311612b9e57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612bf860408701602088016134aa565b846040518363ffffffff1660e01b8152600401612c169291906143a8565b602060405180830381865afa158015612c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c579190614475565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612c8f576000612c91565b835b612ca16040890160208a016134aa565b866040518463ffffffff1660e01b8152600401612cbf9291906143a8565b60206040518083038185885af1158015612cdd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d029190614475565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b612d4261247e565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612d7e90849060040161364f565b600060405180830381600087803b158015612d9857600080fd5b505af11580156110e7573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611c109085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016126ad565b3373ffffffffffffffffffffffffffffffffffffffff821603612e89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109e1565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612f235750612f2384846130b2565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109e1565b6000612feb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130be9092919063ffffffff16565b8051909150156112f2578080602001905181019061300991906144c3565b6112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109e1565b6000828152600284016020526040812082905561273c84846130cd565b600061247783836130d9565b606061273c84846000856130f1565b6000612477838361320a565b60008181526001830160205260408120541515612477565b606082471015613183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ac9190614269565b60006040518083038185875af1925050503d80600081146131e9576040519150601f19603f3d011682016040523d82523d6000602084013e6131ee565b606091505b50915091506131ff87838387613259565b979650505050505050565b60008181526001830160205260408120546132515750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561068c565b50600061068c565b606083156132ef5782516000036132e85773ffffffffffffffffffffffffffffffffffffffff85163b6132e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e1565b508161273c565b61273c83838151156133045781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e19190613713565b50805461334490613afb565b6000825580601f10613354575050565b601f01602090049060005260206000209081019061246891905b80821115613382576000815560010161336e565b5090565b60006020828403121561339857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613409577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461246857600080fd5b60008060006040848603121561343a57600080fd5b83356134458161340f565b9250602084013567ffffffffffffffff8082111561346257600080fd5b818601915086601f83011261347657600080fd5b81358181111561348557600080fd5b87602082850101111561349757600080fd5b6020830194508093505050509250925092565b6000602082840312156134bc57600080fd5b81356124778161340f565b60005b838110156134e25781810151838201526020016134ca565b50506000910152565b600081518084526135038160208601602086016134c7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061354860408301856134eb565b828103602084015261355a81856134eb565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461246857600080fd5b6000806040838503121561359857600080fd5b82356135a381613563565b946020939093013593505050565b6000806000606084860312156135c657600080fd5b83356135d181613563565b925060208401356135e181613563565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613644578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613607565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261368960c08401826134eb565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136c583836134eb565b925060808601519150808584030160a08601525061355a82826135f2565b600080604083850312156136f657600080fd5b82359150602083013561370881613563565b809150509250929050565b60208152600061247760208301846134eb565b60008083601f84011261373857600080fd5b50813567ffffffffffffffff81111561375057600080fd5b6020830191508360208260051b850101111561376b57600080fd5b9250929050565b6000806000806040858703121561378857600080fd5b843567ffffffffffffffff808211156137a057600080fd5b6137ac88838901613726565b909650945060208701359150808211156137c557600080fd5b506137d287828801613726565b95989497509550505050565b6000602082840312156137f057600080fd5b813567ffffffffffffffff81111561380757600080fd5b820160a0818503121561247757600080fd5b6000806020838503121561382c57600080fd5b823567ffffffffffffffff81111561384357600080fd5b61384f85828601613726565b90969095509350505050565b60006020828403121561386d57600080fd5b813561247781613563565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156138ca576138ca613878565b60405290565b6040516060810167ffffffffffffffff811182821017156138ca576138ca613878565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561393a5761393a613878565b604052919050565b600067ffffffffffffffff82111561395c5761395c613878565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261399957600080fd5b81356139ac6139a782613942565b6138f3565b8181528460208386010111156139c157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156139f357600080fd5b83356139fe8161340f565b925060208481013567ffffffffffffffff80821115613a1c57600080fd5b818701915087601f830112613a3057600080fd5b813581811115613a4257613a42613878565b613a50848260051b016138f3565b81815260069190911b8301840190848101908a831115613a6f57600080fd5b938501935b82851015613abb576040858c031215613a8d5760008081fd5b613a956138a7565b8535613aa081613563565b81528587013587820152825260409094019390850190613a74565b965050506040870135925080831115613ad357600080fd5b5050613ae186828701613988565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b0f57607f821691505b602082108103613b48577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613bb157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bf057600080fd5b83018035915067ffffffffffffffff821115613c0b57600080fd5b60200191503681900382131561376b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5557600080fd5b830160208101925035905067ffffffffffffffff811115613c7557600080fd5b80360382131561376b57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613644578135613cf081613563565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613cdd565b602081528135602082015260006020830135613d3d8161340f565b67ffffffffffffffff8082166040850152613d5b6040860186613c20565b925060a06060860152613d7260c086018483613c84565b925050613d826060860186613c20565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613db8858385613c84565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613df157600080fd5b60209288019283019235915083821115613e0a57600080fd5b8160061b3603831315613e1c57600080fd5b8685030160a08701526131ff848284613ccd565b601f8211156112f2576000816000526020600020601f850160051c81016020861015613e595750805b601f850160051c820191505b81811015613e7857828155600101613e65565b505050505050565b67ffffffffffffffff831115613e9857613e98613878565b613eac83613ea68354613afb565b83613e30565b6000601f841160018114613efe5760008515613ec85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110e7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f4d5786850135825560209485019460019092019101613f2d565b5086821015613f88577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613fd481613563565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561403a5761403a613878565b8054838255808410156140c75760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461407b5761407b613f9a565b808616861461408c5761408c613f9a565b5060008360005260206000208360011b81018760011b820191505b808210156140c25782825582848301556002820191506140a7565b505050505b5060008181526020812083915b85811015613e78576140e68383613fc9565b60409290920191600291909101906001016140d4565b813581556001810160208301356141128161340f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141526040860186613bbb565b93509150614164838360028701613e80565b6141716060860186613bbb565b93509150614183838360038701613e80565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126141ba57600080fd5b9184019182359150808211156141cf57600080fd5b506020820191508060061b36038213156141e857600080fd5b611c10818360048601614021565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613bb157600080fd5b801515811461246857600080fd5b60006020828403121561424a57600080fd5b81356124778161422a565b60208152600061273c602083018486613c84565b60008251613bb18184602087016134c7565b60006020828403121561428d57600080fd5b813567ffffffffffffffff808211156142a557600080fd5b90830190606082860312156142b957600080fd5b6142c16138d0565b8235828111156142d057600080fd5b6142dc87828601613988565b8252506020830135828111156142f157600080fd5b6142fd87828601613988565b602083015250604083013592506002831061431757600080fd5b6040810192909252509392505050565b6000806040838503121561433a57600080fd5b825167ffffffffffffffff81111561435157600080fd5b8301601f8101851361436257600080fd5b80516143706139a782613942565b81815286602083850101111561438557600080fd5b6143968260208301602086016134c7565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a060408401526143d460e08401826134eb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261441083836134eb565b9250604086015191508085840301608086015261442d83836135f2565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061446b82826134eb565b9695505050505050565b60006020828403121561448757600080fd5b5051919050565b8082018082111561068c5761068c613f9a565b6040815260006144b460408301856134eb565b90508260208301529392505050565b6000602082840312156144d557600080fd5b81516124778161422a56fea164736f6c6343000818000a", + 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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004acf38038062004acf833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b614431806200069e6000396000f3fe60806040526004361061016e5760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b44851461046f578063f2fde38b14610490578063ff2deec3146104b057600080fd5b8063c89245d51461040f578063cf6730f81461042f578063e4ca87541461044f57600080fd5b80639fe74e26116100b05780639fe74e26146103a4578063b0f479a1146103c4578063c851cc32146103ef57600080fd5b806385572ffb146103385780638da5cb5b1461035857600080fd5b80636939cd97116101225780636fef519e116101075780636fef519e146102ad57806379ba5097146103035780638462a2b91461031857600080fd5b80636939cd97146102605780636d62d6331461028d57600080fd5b80630e958d6b116101535780630e958d6b146101f057806335f170ef146102105780635e35359e1461023e57600080fd5b806305bfe9821461017a5780630a9094dc146101c057600080fd5b3661017557005b600080fd5b34801561018657600080fd5b506101aa61019536600461311a565b60086020526000908152604090205460ff1681565b6040516101b79190613162565b60405180910390f35b3480156101cc57600080fd5b506101e06101db36600461311a565b6104dd565b60405190151581526020016101b7565b3480156101fc57600080fd5b506101e061020b3660046131b9565b6104f0565b34801561021c57600080fd5b5061023061022b36600461323e565b61053b565b6040516101b79291906132c9565b34801561024a57600080fd5b5061025e610259366004613319565b610667565b005b34801561026c57600080fd5b5061028061027b36600461311a565b61073c565b6040516101b791906133b7565b34801561029957600080fd5b5061025e6102a836600461344b565b610947565b3480156102b957600080fd5b506102f66040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101b7919061347b565b34801561030f57600080fd5b5061025e610b5e565b34801561032457600080fd5b5061025e6103333660046134da565b610c5b565b34801561034457600080fd5b5061025e610353366004613546565b610f9c565b34801561036457600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b3480156103b057600080fd5b5061025e6103bf366004613581565b6111a5565b3480156103d057600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661037f565b3480156103fb57600080fd5b5061025e61040a3660046135c3565b611342565b34801561041b57600080fd5b5061025e61042a3660046135c3565b61140e565b34801561043b57600080fd5b5061025e61044a366004613546565b611582565b34801561045b57600080fd5b5061025e61046a36600461311a565b6118aa565b61048261047d366004613746565b611b78565b6040519081526020016101b7565b34801561049c57600080fd5b5061025e6104ab3660046135c3565b61214f565b3480156104bc57600080fd5b5060075461037f9073ffffffffffffffffffffffffffffffffffffffff1681565b60006104ea600583612163565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061051f9085908590613853565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061055690613863565b80601f016020809104026020016040519081016040528092919081815260200182805461058290613863565b80156105cf5780601f106105a4576101008083540402835291602001916105cf565b820191906000526020600020905b8154815290600101906020018083116105b257829003601f168201915b5050505050908060010180546105e490613863565b80601f016020809104026020016040519081016040528092919081815260200182805461061090613863565b801561065d5780601f106106325761010080835404028352916020019161065d565b820191906000526020600020905b81548152906001019060200180831161064057829003601f168201915b5050505050905082565b61066f61217e565b73ffffffffffffffffffffffffffffffffffffffff83166106af576106aa73ffffffffffffffffffffffffffffffffffffffff831682612201565b6106d0565b6106d073ffffffffffffffffffffffffffffffffffffffff8416838361235b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161072f91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107ab90613863565b80601f01602080910402602001604051908101604052809291908181526020018280546107d790613863565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050505050815260200160038201805461083d90613863565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613863565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109395760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108e4565b505050915250909392505050565b61094f61217e565b61095a600583612163565b610998576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a195760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109c4565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a696002830182613068565b610a77600383016000613068565b610a856004830160006130a2565b50610a93905060058461242f565b5060005b8151811015610b0d57610b0583838381518110610ab657610ab66138b6565b602002602001015160200151848481518110610ad457610ad46138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661235b9092919063ffffffff16565b600101610a97565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161098f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c6361217e565b60005b81811015610df65760036000848484818110610c8457610c846138b6565b9050602002810190610c9691906138e5565b610ca490602081019061323e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610cdb57610cdb6138b6565b9050602002810190610ced91906138e5565b610cfb906020810190613923565b604051610d09929190613853565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d5057610d506138b6565b9050602002810190610d6291906138e5565b610d70906020810190613923565b604051610d7e929190613853565b6040518091039020838383818110610d9857610d986138b6565b9050602002810190610daa91906138e5565b610db890602081019061323e565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c66565b5060005b83811015610f9557600160036000878785818110610e1a57610e1a6138b6565b9050602002810190610e2c91906138e5565b610e3a90602081019061323e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e7157610e716138b6565b9050602002810190610e8391906138e5565b610e91906020810190613923565b604051610e9f929190613853565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610eef57610eef6138b6565b9050602002810190610f0191906138e5565b610f0f906020810190613923565b604051610f1d929190613853565b6040518091039020858583818110610f3757610f376138b6565b9050602002810190610f4991906138e5565b610f5790602081019061323e565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610dfa565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610fef576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161098f565b610fff604082016020830161323e565b67ffffffffffffffff811660009081526003602052604090208054819061102590613863565b905060000361106c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161098f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110a8908690600401613a8a565b600060405180830381600087803b1580156110c257600080fd5b505af19250505080156110d3575060015b611173573d808015611101576040519150601f19603f3d011682016040523d82523d6000602084013e611106565b606091505b506111136005853561243b565b508335600090815260046020526040902084906111308282613e64565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061116590849061347b565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111ad61217e565b60005b818110156111a05760008383838181106111cc576111cc6138b6565b90506020028101906111de9190613f5e565b6111e790613fa0565b9050806020015161125257805167ffffffffffffffff16600090815260036020526040812061121591613068565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611339565b806040015151600003611291576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906112bd9082614051565b50606082015160018201906112d29082614051565b5081604001516040516112e5919061416b565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212846060015160405161132f919061347b565b60405180910390a3505b506001016111b0565b61134a61217e565b73ffffffffffffffffffffffffffffffffffffffff8116611397576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61141661217e565b60075473ffffffffffffffffffffffffffffffffffffffff16156114775761147761145660025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612447565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611524576115246114e460025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6125c9565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146115bb576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115cb604082016020830161323e565b6115d86040830183613923565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061162f92509050613863565b159050806116855750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611670919061416b565b9081526040519081900360200190205460ff16155b156116be57806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161098f919061347b565b60006116cd6060850185613923565b8101906116da919061417d565b90506000816040015160018111156116f4576116f4613133565b0361170857611702846126c7565b50505050565b60018160400151600181111561172057611720613133565b036117025760008082602001518060200190518101906117409190614229565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b2146117d8576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff1660028111156117fd576117fd613133565b03611837576040517f33704b280000000000000000000000000000000000000000000000000000000081526004810182905260240161098f565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b6118b5600582612163565b6118ee576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161098f565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161193590613863565b80601f016020809104026020016040519081016040528092919081815260200182805461196190613863565b80156119ae5780601f10611983576101008083540402835291602001916119ae565b820191906000526020600020905b81548152906001019060200180831161199157829003601f168201915b505050505081526020016003820180546119c790613863565b80601f01602080910402602001604051908101604052809291908181526020018280546119f390613863565b8015611a405780601f10611a1557610100808354040283529160200191611a40565b820191906000526020600020905b815481529060010190602001808311611a2357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611ac35760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611a6e565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b156002830182613068565b611b23600383016000613068565b611b316004830160006130a2565b50611b3f905060058361242f565b50611b4981612a46565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ba190613863565b9050600003611be8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161098f565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611c1890613863565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4490613863565b8015611c915780601f10611c6657610100808354040283529160200191611c91565b820191906000526020600020905b815481529060010190602001808311611c7457829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611cf290613863565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1e90613863565b8015611d6b5780601f10611d4057610100808354040283529160200191611d6b565b820191906000526020600020905b815481529060010190602001808311611d4e57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611dd2908b9086906004016142aa565b602060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190614377565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615801590611ecc57506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eca9190614377565b105b15611ef657600754611ef69073ffffffffffffffffffffffffffffffffffffffff16333084612ab8565b60005b875181101561204957611f6933308a8481518110611f1957611f196138b6565b6020026020010151602001518b8581518110611f3757611f376138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ab8909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611f9957611f996138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120415760025488516120419173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611ff257611ff26138b6565b6020026020010151602001518a8481518110612010576120106138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124479092919063ffffffff16565b600101611ef9565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561207c57600061207e565b825b8a856040518463ffffffff1660e01b815260040161209d9291906142aa565b60206040518083038185885af11580156120bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120e09190614377565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61215761217e565b61216081612b16565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161098f565b565b8047101561226b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161098f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122c5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ca565b606091505b50509050806111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161098f565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111a09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612c0b565b60006121778383612d17565b60006121778383612e0a565b8015806124e757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e59190614377565b155b612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161098f565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111a09084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016123ad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126649190614377565b61266e9190614390565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117029085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016123ad565b60006040518060a001604052808380604001906126e49190613923565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060208281019190915291519282019261276592873591016143a3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156127df57816020015b60408051808201909152600080825260208201528152602001906001900390816127b85790505b50815260075473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260409182019160039160009161281f9190880190880161323e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461284f90613863565b80601f016020809104026020016040519081016040528092919081815260200182805461287b90613863565b80156128c85780601f1061289d576101008083540402835291602001916128c8565b820191906000526020600020905b8154815290600101906020018083116128ab57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612905604086016020870161323e565b846040518363ffffffff1660e01b81526004016129239291906142aa565b602060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129649190614377565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561299c57600061299e565b835b6129ae604088016020890161323e565b866040518463ffffffff1660e01b81526004016129cc9291906142aa565b60206040518083038185885af11580156129ea573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a0f9190614377565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b612a4e61217e565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612a8a9084906004016133b7565b600060405180830381600087803b158015612aa457600080fd5b505af1158015610f95573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117029085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016123ad565b3373ffffffffffffffffffffffffffffffffffffffff821603612b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161098f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612c6d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e599092919063ffffffff16565b8051909150156111a05780806020019051810190612c8b91906143c5565b6111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161098f565b60008181526001830160205260408120548015612e00576000612d3b6001836143e2565b8554909150600090612d4f906001906143e2565b9050818114612db4576000866000018281548110612d6f57612d6f6138b6565b9060005260206000200154905080876000018481548110612d9257612d926138b6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612dc557612dc56143f5565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104ea565b60009150506104ea565b6000818152600183016020526040812054612e51575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104ea565b5060006104ea565b6060612e688484600085612e70565b949350505050565b606082471015612f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161098f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f2b919061416b565b60006040518083038185875af1925050503d8060008114612f68576040519150601f19603f3d011682016040523d82523d6000602084013e612f6d565b606091505b5091509150612f7e87838387612f89565b979650505050505050565b6060831561301f5782516000036130185773ffffffffffffffffffffffffffffffffffffffff85163b613018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161098f565b5081612e68565b612e6883838151156130345781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f919061347b565b50805461307490613863565b6000825580601f10613084575050565b601f01602090049060005260206000209081019061216091906130c3565b508054600082556002029060005260206000209081019061216091906130dc565b5b808211156130d857600081556001016130c4565b5090565b5b808211156130d85780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600060018201556002016130dd565b60006020828403121561312c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061319d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461216057600080fd5b6000806000604084860312156131ce57600080fd5b83356131d9816131a3565b9250602084013567ffffffffffffffff808211156131f657600080fd5b818601915086601f83011261320a57600080fd5b81358181111561321957600080fd5b87602082850101111561322b57600080fd5b6020830194508093505050509250925092565b60006020828403121561325057600080fd5b8135612177816131a3565b60005b8381101561327657818101518382015260200161325e565b50506000910152565b6000815180845261329781602086016020860161325b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006132dc604083018561327f565b82810360208401526132ee818561327f565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461216057600080fd5b60008060006060848603121561332e57600080fd5b8335613339816132f7565b92506020840135613349816132f7565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156133ac578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161336f565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526133f160c084018261327f565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261342d838361327f565b925060808601519150808584030160a0860152506132ee828261335a565b6000806040838503121561345e57600080fd5b823591506020830135613470816132f7565b809150509250929050565b602081526000612177602083018461327f565b60008083601f8401126134a057600080fd5b50813567ffffffffffffffff8111156134b857600080fd5b6020830191508360208260051b85010111156134d357600080fd5b9250929050565b600080600080604085870312156134f057600080fd5b843567ffffffffffffffff8082111561350857600080fd5b6135148883890161348e565b9096509450602087013591508082111561352d57600080fd5b5061353a8782880161348e565b95989497509550505050565b60006020828403121561355857600080fd5b813567ffffffffffffffff81111561356f57600080fd5b820160a0818503121561217757600080fd5b6000806020838503121561359457600080fd5b823567ffffffffffffffff8111156135ab57600080fd5b6135b78582860161348e565b90969095509350505050565b6000602082840312156135d557600080fd5b8135612177816132f7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613632576136326135e0565b60405290565b6040516060810167ffffffffffffffff81118282101715613632576136326135e0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136a2576136a26135e0565b604052919050565b600067ffffffffffffffff8211156136c4576136c46135e0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261370157600080fd5b813561371461370f826136aa565b61365b565b81815284602083860101111561372957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561375b57600080fd5b8335613766816131a3565b925060208481013567ffffffffffffffff8082111561378457600080fd5b818701915087601f83011261379857600080fd5b8135818111156137aa576137aa6135e0565b6137b8848260051b0161365b565b81815260069190911b8301840190848101908a8311156137d757600080fd5b938501935b82851015613823576040858c0312156137f55760008081fd5b6137fd61360f565b8535613808816132f7565b815285870135878201528252604090940193908501906137dc565b96505050604087013592508083111561383b57600080fd5b5050613849868287016136f0565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061387757607f821691505b6020821081036138b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261391957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261395857600080fd5b83018035915067ffffffffffffffff82111561397357600080fd5b6020019150368190038213156134d357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139bd57600080fd5b830160208101925035905067ffffffffffffffff8111156139dd57600080fd5b8036038213156134d357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133ac578135613a58816132f7565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613a45565b602081528135602082015260006020830135613aa5816131a3565b67ffffffffffffffff8082166040850152613ac36040860186613988565b925060a06060860152613ada60c0860184836139ec565b925050613aea6060860186613988565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613b208583856139ec565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613b5957600080fd5b60209288019283019235915083821115613b7257600080fd5b8160061b3603831315613b8457600080fd5b8685030160a0870152612f7e848284613a35565b601f8211156111a0576000816000526020600020601f850160051c81016020861015613bc15750805b601f850160051c820191505b81811015613be057828155600101613bcd565b505050505050565b67ffffffffffffffff831115613c0057613c006135e0565b613c1483613c0e8354613863565b83613b98565b6000601f841160018114613c665760008515613c305750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f95565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613cb55786850135825560209485019460019092019101613c95565b5086821015613cf0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613d3c816132f7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613da257613da26135e0565b805483825580841015613e2f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613de357613de3613d02565b8086168614613df457613df4613d02565b5060008360005260206000208360011b81018760011b820191505b80821015613e2a578282558284830155600282019150613e0f565b505050505b5060008181526020812083915b85811015613be057613e4e8383613d31565b6040929092019160029190910190600101613e3c565b81358155600181016020830135613e7a816131a3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613eba6040860186613923565b93509150613ecc838360028701613be8565b613ed96060860186613923565b93509150613eeb838360038701613be8565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613f2257600080fd5b918401918235915080821115613f3757600080fd5b506020820191508060061b3603821315613f5057600080fd5b611702818360048601613d89565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261391957600080fd5b801515811461216057600080fd5b600060808236031215613fb257600080fd5b6040516080810167ffffffffffffffff8282108183111715613fd657613fd66135e0565b8160405284359150613fe7826131a3565b908252602084013590613ff982613f92565b816020840152604085013591508082111561401357600080fd5b61401f368387016136f0565b6040840152606085013591508082111561403857600080fd5b50614045368286016136f0565b60608301525092915050565b815167ffffffffffffffff81111561406b5761406b6135e0565b61407f816140798454613863565b84613b98565b602080601f8311600181146140d2576000841561409c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613be0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561411f57888601518255948401946001909101908401614100565b508582101561415b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161391981846020870161325b565b60006020828403121561418f57600080fd5b813567ffffffffffffffff808211156141a757600080fd5b90830190606082860312156141bb57600080fd5b6141c3613638565b8235828111156141d257600080fd5b6141de878286016136f0565b8252506020830135828111156141f357600080fd5b6141ff878286016136f0565b602083015250604083013592506002831061421957600080fd5b6040810192909252509392505050565b6000806040838503121561423c57600080fd5b825167ffffffffffffffff81111561425357600080fd5b8301601f8101851361426457600080fd5b805161427261370f826136aa565b81815286602083850101111561428757600080fd5b61429882602083016020860161325b565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a060408401526142d660e084018261327f565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614312838361327f565b9250604086015191508085840301608086015261432f838361335a565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061436d828261327f565b9695505050505050565b60006020828403121561438957600080fd5b5051919050565b808201808211156104ea576104ea613d02565b6040815260006143b6604083018561327f565b90508260208301529392505050565b6000602082840312156143d757600080fd5b815161217781613f92565b818103818111156104ea576104ea613d02565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientWithACKABI = CCIPClientWithACKMetaData.ABI @@ -240,28 +240,6 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetMessageContents(mes return _CCIPClientWithACK.Contract.GetMessageContents(&_CCIPClientWithACK.CallOpts, messageId) } -func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { - var out []interface{} - err := _CCIPClientWithACK.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 (_CCIPClientWithACK *CCIPClientWithACKSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _CCIPClientWithACK.Contract.GetMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) -} - -func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _CCIPClientWithACK.Contract.GetMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) -} - func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _CCIPClientWithACK.contract.Call(opts, &out, "getRouter") @@ -306,6 +284,28 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) IsApprovedSender(sourc return _CCIPClientWithACK.Contract.IsApprovedSender(&_CCIPClientWithACK.CallOpts, sourceChainSelector, senderAddr) } +func (_CCIPClientWithACK *CCIPClientWithACKCaller) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) { + var out []interface{} + err := _CCIPClientWithACK.contract.Call(opts, &out, "isFailedMessage", messageId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPClientWithACK.Contract.IsFailedMessage(&_CCIPClientWithACK.CallOpts, messageId) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPClientWithACK.Contract.IsFailedMessage(&_CCIPClientWithACK.CallOpts, messageId) +} + func (_CCIPClientWithACK *CCIPClientWithACKCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _CCIPClientWithACK.contract.Call(opts, &out, "owner") @@ -534,18 +534,6 @@ func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdateRouter(newRo return _CCIPClientWithACK.Contract.UpdateRouter(&_CCIPClientWithACK.TransactOpts, newRouter) } -func (_CCIPClientWithACK *CCIPClientWithACKTransactor) WithdrawNativeToken(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPClientWithACK.contract.Transact(opts, "withdrawNativeToken", to, amount) -} - -func (_CCIPClientWithACK *CCIPClientWithACKSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPClientWithACK.Contract.WithdrawNativeToken(&_CCIPClientWithACK.TransactOpts, to, amount) -} - -func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) WithdrawNativeToken(to common.Address, amount *big.Int) (*types.Transaction, error) { - return _CCIPClientWithACK.Contract.WithdrawNativeToken(&_CCIPClientWithACK.TransactOpts, to, amount) -} - func (_CCIPClientWithACK *CCIPClientWithACKTransactor) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { return _CCIPClientWithACK.contract.Transact(opts, "withdrawTokens", token, to, amount) } @@ -2785,12 +2773,12 @@ type CCIPClientWithACKInterface 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) + IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) + Owner(opts *bind.CallOpts) (common.Address, error) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, @@ -2823,8 +2811,6 @@ type CCIPClientWithACKInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(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 069bd4e6da..b0f41f26ed 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -56,8 +56,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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162003098380380620030988339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e9a80620001fe6000396000f3fe6080604052600436106101125760003560e01c80638462a2b9116100a5578063b0f479a111610074578063cf6730f811610059578063cf6730f81461034a578063e4ca87541461036a578063f2fde38b1461038a57600080fd5b8063b0f479a1146102ff578063c851cc321461032a57600080fd5b80638462a2b91461025357806385572ffb146102735780638da5cb5b146102935780639fe74e26146102df57600080fd5b80635e35359e116100e15780635e35359e146101d15780636939cd97146101f15780636d62d6331461021e57806379ba50971461023e57600080fd5b80630e958d6b1461011e57806335f170ef146101535780635075a9d414610181578063536c6bfa146101af57600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e610139366004612246565b6103aa565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e3660046122cb565b6103f5565b60405161014a929190612356565b34801561018d57600080fd5b506101a161019c366004612384565b610521565b60405190815260200161014a565b3480156101bb57600080fd5b506101cf6101ca3660046123bf565b610534565b005b3480156101dd57600080fd5b506101cf6101ec3660046123eb565b610598565b3480156101fd57600080fd5b5061021161020c366004612384565b61062d565b60405161014a919061242c565b34801561022a57600080fd5b506101cf610239366004612513565b610838565b34801561024a57600080fd5b506101cf610b52565b34801561025f57600080fd5b506101cf61026e36600461258f565b610c4f565b34801561027f57600080fd5b506101cf61028e3660046125fb565b610f90565b34801561029f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b3480156102eb57600080fd5b506101cf6102fa366004612636565b611199565b34801561030b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102ba565b34801561033657600080fd5b506101cf610345366004612678565b61152a565b34801561035657600080fd5b506101cf6103653660046125fb565b6115f6565b34801561037657600080fd5b506101cf610385366004612384565b611732565b34801561039657600080fd5b506101cf6103a5366004612678565b61199c565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103d99085908590612695565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610410906126a5565b80601f016020809104026020016040519081016040528092919081815260200182805461043c906126a5565b80156104895780601f1061045e57610100808354040283529160200191610489565b820191906000526020600020905b81548152906001019060200180831161046c57829003601f168201915b50505050509080600101805461049e906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546104ca906126a5565b80156105175780601f106104ec57610100808354040283529160200191610517565b820191906000526020600020905b8154815290600101906020018083116104fa57829003601f168201915b5050505050905082565b600061052e6005836119b0565b92915050565b61053c6119c3565b6105468282611a46565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6105a06119c3565b6105c173ffffffffffffffffffffffffffffffffffffffff84168383611ba0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161062091815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161069c906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546106c8906126a5565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b5050505050815260200160038201805461072e906126a5565b80601f016020809104026020016040519081016040528092919081815260200182805461075a906126a5565b80156107a75780601f1061077c576101008083540402835291602001916107a7565b820191906000526020600020905b81548152906001019060200180831161078a57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561082a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016107d5565b505050915250909392505050565b6108406119c3565b600161084d6005846119b0565b1461088c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b61089c8260025b60059190611c2d565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916108e4906126a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610910906126a5565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b50505050508152602001600382018054610976906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546109a2906126a5565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a725760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a1d565b5050505081525050905060005b816080015151811015610b0157610af98383608001518381518110610aa657610aa66126f8565b60200260200101516020015184608001518481518110610ac857610ac86126f8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611ba09092919063ffffffff16565b600101610a7f565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610883565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c576119c3565b60005b81811015610dea5760036000848484818110610c7857610c786126f8565b9050602002810190610c8a9190612727565b610c989060208101906122cb565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610ccf57610ccf6126f8565b9050602002810190610ce19190612727565b610cef906020810190612765565b604051610cfd929190612695565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d4457610d446126f8565b9050602002810190610d569190612727565b610d64906020810190612765565b604051610d72929190612695565b6040518091039020838383818110610d8c57610d8c6126f8565b9050602002810190610d9e9190612727565b610dac9060208101906122cb565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c5a565b5060005b83811015610f8957600160036000878785818110610e0e57610e0e6126f8565b9050602002810190610e209190612727565b610e2e9060208101906122cb565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e6557610e656126f8565b9050602002810190610e779190612727565b610e85906020810190612765565b604051610e93929190612695565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610ee357610ee36126f8565b9050602002810190610ef59190612727565b610f03906020810190612765565b604051610f11929190612695565b6040518091039020858583818110610f2b57610f2b6126f8565b9050602002810190610f3d9190612727565b610f4b9060208101906122cb565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610dee565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610fe3576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610883565b610ff360408201602083016122cb565b67ffffffffffffffff8116600090815260036020526040902080548190611019906126a5565b9050600003611060576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610883565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061109c9086906004016128d7565b600060405180830381600087803b1580156110b657600080fd5b505af19250505080156110c7575060015b611167573d8080156110f5576040519150601f19603f3d011682016040523d82523d6000602084013e6110fa565b606091505b5061110784356001610893565b508335600090815260046020526040902084906111248282612cd8565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611159908490612dd8565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111a16119c3565b60005b81811015611194578282828181106111be576111be6126f8565b90506020028101906111d09190612deb565b6111e1906040810190602001612e2d565b6112ad57600360008484848181106111fb576111fb6126f8565b905060200281019061120d9190612deb565b61121b9060208101906122cb565b67ffffffffffffffff16815260208101919091526040016000908120611240916121e2565b828282818110611252576112526126f8565b90506020028101906112649190612deb565b6112729060208101906122cb565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611522565b8282828181106112bf576112bf6126f8565b90506020028101906112d19190612deb565b6112df906040810190612765565b905060000361131a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110611332576113326126f8565b90506020028101906113449190612deb565b6113529060208101906122cb565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611388576113886126f8565b905060200281019061139a9190612deb565b6113a8906040810190612765565b82916113b5919083612a64565b508383838181106113c8576113c86126f8565b90506020028101906113da9190612deb565b6113e8906060810190612765565b15905061143357838383818110611401576114016126f8565b90506020028101906114139190612deb565b611421906060810190612765565b6001830191611431919083612a64565b505b838383818110611445576114456126f8565b90506020028101906114579190612deb565b611465906040810190612765565b604051611473929190612695565b604051809103902084848481811061148d5761148d6126f8565b905060200281019061149f9190612deb565b6114ad9060208101906122cb565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128686868181106114ea576114ea6126f8565b90506020028101906114fc9190612deb565b61150a906060810190612765565b604051611518929190612e4a565b60405180910390a3505b6001016111a4565b6115326119c3565b73ffffffffffffffffffffffffffffffffffffffff811661157f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b33301461162f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61163f60408201602083016122cb565b61164c6040830183612765565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116a3925090506126a5565b159050806116f95750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116e49190612e5e565b9081526040519081900360200190205460ff16155b1561119457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108839190612dd8565b600161173f6005836119b0565b14611779576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610883565b611784816000610893565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916117cc906126a5565b80601f01602080910402602001604051908101604052809291908181526020018280546117f8906126a5565b80156118455780601f1061181a57610100808354040283529160200191611845565b820191906000526020600020905b81548152906001019060200180831161182857829003601f168201915b5050505050815260200160038201805461185e906126a5565b80601f016020809104026020016040519081016040528092919081815260200182805461188a906126a5565b80156118d75780601f106118ac576101008083540402835291602001916118d7565b820191906000526020600020905b8154815290600101906020018083116118ba57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561195a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611905565b5050505081525050905061196d81611c42565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6119a46119c3565b6119ad81611cb4565b50565b60006119bc8383611da9565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610883565b565b80471015611ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610883565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b0a576040519150601f19603f3d011682016040523d82523d6000602084013e611b0f565b606091505b5050905080611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610883565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611194908490611e33565b6000611c3a848484611f3f565b949350505050565b611c4a6119c3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611c8690849060040161242c565b600060405180830381600087803b158015611ca057600080fd5b505af1158015610f89573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610883565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580611dcd5750611dcd8484611f5c565b6119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610883565b6000611e95826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f689092919063ffffffff16565b8051909150156111945780806020019051810190611eb39190612e70565b611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610883565b60008281526002840160205260408120829055611c3a8484611f77565b60006119bc8383611f83565b6060611c3a8484600085611f9b565b60006119bc83836120b4565b600081815260018301602052604081205415156119bc565b60608247101561202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610883565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120569190612e5e565b60006040518083038185875af1925050503d8060008114612093576040519150601f19603f3d011682016040523d82523d6000602084013e612098565b606091505b50915091506120a987838387612103565b979650505050505050565b60008181526001830160205260408120546120fb5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561052e565b50600061052e565b606083156121995782516000036121925773ffffffffffffffffffffffffffffffffffffffff85163b612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610883565b5081611c3a565b611c3a83838151156121ae5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108839190612dd8565b5080546121ee906126a5565b6000825580601f106121fe575050565b601f0160209004906000526020600020908101906119ad91905b8082111561222c5760008155600101612218565b5090565b67ffffffffffffffff811681146119ad57600080fd5b60008060006040848603121561225b57600080fd5b833561226681612230565b9250602084013567ffffffffffffffff8082111561228357600080fd5b818601915086601f83011261229757600080fd5b8135818111156122a657600080fd5b8760208285010111156122b857600080fd5b6020830194508093505050509250925092565b6000602082840312156122dd57600080fd5b81356119bc81612230565b60005b838110156123035781810151838201526020016122eb565b50506000910152565b600081518084526123248160208601602086016122e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612369604083018561230c565b828103602084015261237b818561230c565b95945050505050565b60006020828403121561239657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146119ad57600080fd5b600080604083850312156123d257600080fd5b82356123dd8161239d565b946020939093013593505050565b60008060006060848603121561240057600080fd5b833561240b8161239d565b9250602084013561241b8161239d565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a0606086015261246a60c086018361230c565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808785030160808801526124a6848361230c565b608089015188820390920160a089015281518082529186019450600092508501905b80831015612507578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019290920191908301906124c8565b50979650505050505050565b6000806040838503121561252657600080fd5b8235915060208301356125388161239d565b809150509250929050565b60008083601f84011261255557600080fd5b50813567ffffffffffffffff81111561256d57600080fd5b6020830191508360208260051b850101111561258857600080fd5b9250929050565b600080600080604085870312156125a557600080fd5b843567ffffffffffffffff808211156125bd57600080fd5b6125c988838901612543565b909650945060208701359150808211156125e257600080fd5b506125ef87828801612543565b95989497509550505050565b60006020828403121561260d57600080fd5b813567ffffffffffffffff81111561262457600080fd5b820160a081850312156119bc57600080fd5b6000806020838503121561264957600080fd5b823567ffffffffffffffff81111561266057600080fd5b61266c85828601612543565b90969095509350505050565b60006020828403121561268a57600080fd5b81356119bc8161239d565b8183823760009101908152919050565b600181811c908216806126b957607f821691505b6020821081036126f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261275b57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261279a57600080fd5b83018035915067ffffffffffffffff8211156127b557600080fd5b60200191503681900382131561258857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127ff57600080fd5b830160208101925035905067ffffffffffffffff81111561281f57600080fd5b80360382131561258857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156128cc57813561289a8161239d565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612887565b509495945050505050565b6020815281356020820152600060208301356128f281612230565b67ffffffffffffffff808216604085015261291060408601866127ca565b925060a0606086015261292760c08601848361282e565b92505061293760608601866127ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261296d85838561282e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126129a657600080fd5b602092880192830192359150838211156129bf57600080fd5b8160061b36038313156129d157600080fd5b8685030160a08701526120a9848284612877565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611194576000816000526020600020601f850160051c81016020861015612a3d5750805b601f850160051c820191505b81811015612a5c57828155600101612a49565b505050505050565b67ffffffffffffffff831115612a7c57612a7c6129e5565b612a9083612a8a83546126a5565b83612a14565b6000601f841160018114612ae25760008515612aac5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f89565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015612b315786850135825560209485019460019092019101612b11565b5086821015612b6c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b600181901b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168214612bdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919050565b8135612beb8161239d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115612c5157612c516129e5565b805483825580841015612ca357612c6781612b7e565b612c7085612b7e565b6000848152602081209283019291909101905b82821015612c9f57808255806001830155600282019150612c83565b5050505b5060008181526020812083915b85811015612a5c57612cc28383612be0565b6040929092019160029190910190600101612cb0565b81358155600181016020830135612cee81612230565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612d2e6040860186612765565b93509150612d40838360028701612a64565b612d4d6060860186612765565b93509150612d5f838360038701612a64565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612d9657600080fd5b918401918235915080821115612dab57600080fd5b506020820191508060061b3603821315612dc457600080fd5b612dd2818360048601612c38565b50505050565b6020815260006119bc602083018461230c565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261275b57600080fd5b80151581146119ad57600080fd5b600060208284031215612e3f57600080fd5b81356119bc81612e1f565b602081526000611c3a60208301848661282e565b6000825161275b8184602087016122e8565b600060208284031215612e8257600080fd5b81516119bc81612e1f56fea164736f6c6343000818000a", + 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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200308e3803806200308e8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e9080620001fe6000396000f3fe6080604052600436106100f75760003560e01c806385572ffb1161008a578063c851cc3211610059578063c851cc32146102e1578063cf6730f814610301578063e4ca875414610321578063f2fde38b1461034157600080fd5b806385572ffb1461022a5780638da5cb5b1461024a5780639fe74e2614610296578063b0f479a1146102b657600080fd5b80636939cd97116100c65780636939cd97146101a85780636d62d633146101d557806379ba5097146101f55780638462a2b91461020a57600080fd5b80630a9094dc146101035780630e958d6b1461013857806335f170ef146101585780635e35359e1461018657600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004611fc3565b610361565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610123610153366004611ff2565b610374565b34801561016457600080fd5b50610178610173366004612077565b6103bf565b60405161012f929190612102565b34801561019257600080fd5b506101a66101a1366004612152565b6104eb565b005b3480156101b457600080fd5b506101c86101c3366004611fc3565b6105c0565b60405161012f9190612193565b3480156101e157600080fd5b506101a66101f036600461227a565b6107cb565b34801561020157600080fd5b506101a66109e2565b34801561021657600080fd5b506101a66102253660046122f6565b610adf565b34801561023657600080fd5b506101a6610245366004612362565b610e20565b34801561025657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161012f565b3480156102a257600080fd5b506101a66102b136600461239d565b611029565b3480156102c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610271565b3480156102ed57600080fd5b506101a66102fc3660046123df565b6111c6565b34801561030d57600080fd5b506101a661031c366004612362565b611292565b34801561032d57600080fd5b506101a661033c366004611fc3565b6113ce565b34801561034d57600080fd5b506101a661035c3660046123df565b61169c565b600061036e6005836116b0565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103a390859085906123fc565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906103da9061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546104069061240c565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b5050505050908060010180546104689061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546104949061240c565b80156104e15780601f106104b6576101008083540402835291602001916104e1565b820191906000526020600020905b8154815290600101906020018083116104c457829003601f168201915b5050505050905082565b6104f36116cb565b73ffffffffffffffffffffffffffffffffffffffff83166105335761052e73ffffffffffffffffffffffffffffffffffffffff83168261174e565b610554565b61055473ffffffffffffffffffffffffffffffffffffffff841683836118a8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105b391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161062f9061240c565b80601f016020809104026020016040519081016040528092919081815260200182805461065b9061240c565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016003820180546106c19061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed9061240c565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610768565b505050915250909392505050565b6107d36116cb565b6107de6005836116b0565b61081c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561089d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610848565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506108ed6002830182611f11565b6108fb600383016000611f11565b610909600483016000611f4b565b506109179050600584611935565b5060005b8151811015610991576109898383838151811061093a5761093a61245f565b6020026020010151602001518484815181106109585761095861245f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166118a89092919063ffffffff16565b60010161091b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610813565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ae76116cb565b60005b81811015610c7a5760036000848484818110610b0857610b0861245f565b9050602002810190610b1a919061248e565b610b28906020810190612077565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610b5f57610b5f61245f565b9050602002810190610b71919061248e565b610b7f9060208101906124cc565b604051610b8d9291906123fc565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610bd457610bd461245f565b9050602002810190610be6919061248e565b610bf49060208101906124cc565b604051610c029291906123fc565b6040518091039020838383818110610c1c57610c1c61245f565b9050602002810190610c2e919061248e565b610c3c906020810190612077565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610aea565b5060005b83811015610e1957600160036000878785818110610c9e57610c9e61245f565b9050602002810190610cb0919061248e565b610cbe906020810190612077565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610cf557610cf561245f565b9050602002810190610d07919061248e565b610d159060208101906124cc565b604051610d239291906123fc565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610d7357610d7361245f565b9050602002810190610d85919061248e565b610d939060208101906124cc565b604051610da19291906123fc565b6040518091039020858583818110610dbb57610dbb61245f565b9050602002810190610dcd919061248e565b610ddb906020810190612077565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610c7e565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e73576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610813565b610e836040820160208301612077565b67ffffffffffffffff8116600090815260036020526040902080548190610ea99061240c565b9050600003610ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610813565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f2c90869060040161263e565b600060405180830381600087803b158015610f4657600080fd5b505af1925050508015610f57575060015b610ff7573d808015610f85576040519150601f19603f3d011682016040523d82523d6000602084013e610f8a565b606091505b50610f9760058535611941565b50833560009081526004602052604090208490610fb48282612a47565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610fe9908490612b47565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6110316116cb565b60005b818110156110245760008383838181106110505761105061245f565b90506020028101906110629190612b5a565b61106b90612c47565b905080602001516110d657805167ffffffffffffffff16600090815260036020526040812061109991611f11565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26111bd565b806040015151600003611115576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906111419082612cf8565b50606082015160018201906111569082612cf8565b5081604001516040516111699190612e12565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284606001516040516111b39190612b47565b60405180910390a3505b50600101611034565b6111ce6116cb565b73ffffffffffffffffffffffffffffffffffffffff811661121b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146112cb576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112db6040820160208301612077565b6112e860408301836124cc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061133f9250905061240c565b159050806113955750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516113809190612e12565b9081526040519081900360200190205460ff16155b1561102457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108139190612b47565b6113d96005826116b0565b611412576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610813565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916114599061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546114859061240c565b80156114d25780601f106114a7576101008083540402835291602001916114d2565b820191906000526020600020905b8154815290600101906020018083116114b557829003601f168201915b505050505081526020016003820180546114eb9061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546115179061240c565b80156115645780601f1061153957610100808354040283529160200191611564565b820191906000526020600020905b81548152906001019060200180831161154757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115e75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611592565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506116396002830182611f11565b611647600383016000611f11565b611655600483016000611f4b565b506116639050600583611935565b5061166d8161194d565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6116a46116cb565b6116ad816119bf565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610813565b565b804710156117b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610813565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611812576040519150601f19603f3d011682016040523d82523d6000602084013e611817565b606091505b5050905080611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610813565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611024908490611ab4565b60006116c48383611bc0565b60006116c48383611cb3565b6119556116cb565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611991908490600401612193565b600060405180830381600087803b1580156119ab57600080fd5b505af1158015610e19573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610813565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b16826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d029092919063ffffffff16565b8051909150156110245780806020019051810190611b349190612e24565b611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610813565b60008181526001830160205260408120548015611ca9576000611be4600183612e41565b8554909150600090611bf890600190612e41565b9050818114611c5d576000866000018281548110611c1857611c1861245f565b9060005260206000200154905080876000018481548110611c3b57611c3b61245f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c6e57611c6e612e54565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061036e565b600091505061036e565b6000818152600183016020526040812054611cfa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561036e565b50600061036e565b6060611d118484600085611d19565b949350505050565b606082471015611dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610813565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611dd49190612e12565b60006040518083038185875af1925050503d8060008114611e11576040519150601f19603f3d011682016040523d82523d6000602084013e611e16565b606091505b5091509150611e2787838387611e32565b979650505050505050565b60608315611ec8578251600003611ec15773ffffffffffffffffffffffffffffffffffffffff85163b611ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610813565b5081611d11565b611d118383815115611edd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139190612b47565b508054611f1d9061240c565b6000825580601f10611f2d575050565b601f0160209004906000526020600020908101906116ad9190611f6c565b50805460008255600202906000526020600020908101906116ad9190611f85565b5b80821115611f815760008155600101611f6d565b5090565b5b80821115611f815780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201611f86565b600060208284031215611fd557600080fd5b5035919050565b67ffffffffffffffff811681146116ad57600080fd5b60008060006040848603121561200757600080fd5b833561201281611fdc565b9250602084013567ffffffffffffffff8082111561202f57600080fd5b818601915086601f83011261204357600080fd5b81358181111561205257600080fd5b87602082850101111561206457600080fd5b6020830194508093505050509250925092565b60006020828403121561208957600080fd5b81356116c481611fdc565b60005b838110156120af578181015183820152602001612097565b50506000910152565b600081518084526120d0816020860160208601612094565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061211560408301856120b8565b828103602084015261212781856120b8565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146116ad57600080fd5b60008060006060848603121561216757600080fd5b833561217281612130565b9250602084013561218281612130565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a060608601526121d160c08601836120b8565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261220d84836120b8565b608089015188820390920160a089015281518082529186019450600092508501905b8083101561226e578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600192909201919083019061222f565b50979650505050505050565b6000806040838503121561228d57600080fd5b82359150602083013561229f81612130565b809150509250929050565b60008083601f8401126122bc57600080fd5b50813567ffffffffffffffff8111156122d457600080fd5b6020830191508360208260051b85010111156122ef57600080fd5b9250929050565b6000806000806040858703121561230c57600080fd5b843567ffffffffffffffff8082111561232457600080fd5b612330888389016122aa565b9096509450602087013591508082111561234957600080fd5b50612356878288016122aa565b95989497509550505050565b60006020828403121561237457600080fd5b813567ffffffffffffffff81111561238b57600080fd5b820160a081850312156116c457600080fd5b600080602083850312156123b057600080fd5b823567ffffffffffffffff8111156123c757600080fd5b6123d3858286016122aa565b90969095509350505050565b6000602082840312156123f157600080fd5b81356116c481612130565b8183823760009101908152919050565b600181811c9082168061242057607f821691505b602082108103612459577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126124c257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261250157600080fd5b83018035915067ffffffffffffffff82111561251c57600080fd5b6020019150368190038213156122ef57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261256657600080fd5b830160208101925035905067ffffffffffffffff81111561258657600080fd5b8036038213156122ef57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561263357813561260181612130565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016125ee565b509495945050505050565b60208152813560208201526000602083013561265981611fdc565b67ffffffffffffffff80821660408501526126776040860186612531565b925060a0606086015261268e60c086018483612595565b92505061269e6060860186612531565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526126d4858385612595565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261270d57600080fd5b6020928801928301923591508382111561272657600080fd5b8160061b360383131561273857600080fd5b8685030160a0870152611e278482846125de565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611024576000816000526020600020601f850160051c810160208610156127a45750805b601f850160051c820191505b818110156127c3578281556001016127b0565b505050505050565b67ffffffffffffffff8311156127e3576127e361274c565b6127f7836127f1835461240c565b8361277b565b6000601f84116001811461284957600085156128135750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e19565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156128985786850135825560209485019460019092019101612878565b50868210156128d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561291f81612130565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156129855761298561274c565b805483825580841015612a125760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146129c6576129c66128e5565b80861686146129d7576129d76128e5565b5060008360005260206000208360011b81018760011b820191505b80821015612a0d5782825582848301556002820191506129f2565b505050505b5060008181526020812083915b858110156127c357612a318383612914565b6040929092019160029190910190600101612a1f565b81358155600181016020830135612a5d81611fdc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612a9d60408601866124cc565b93509150612aaf8383600287016127cb565b612abc60608601866124cc565b93509150612ace8383600387016127cb565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612b0557600080fd5b918401918235915080821115612b1a57600080fd5b506020820191508060061b3603821315612b3357600080fd5b612b4181836004860161296c565b50505050565b6020815260006116c460208301846120b8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126124c257600080fd5b80151581146116ad57600080fd5b600082601f830112612bad57600080fd5b813567ffffffffffffffff80821115612bc857612bc861274c565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c0e57612c0e61274c565b81604052838152866020858801011115612c2757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808236031215612c5957600080fd5b6040516080810167ffffffffffffffff8282108183111715612c7d57612c7d61274c565b8160405284359150612c8e82611fdc565b908252602084013590612ca082612b8e565b8160208401526040850135915080821115612cba57600080fd5b612cc636838701612b9c565b60408401526060850135915080821115612cdf57600080fd5b50612cec36828601612b9c565b60608301525092915050565b815167ffffffffffffffff811115612d1257612d1261274c565b612d2681612d20845461240c565b8461277b565b602080601f831160018114612d795760008415612d435750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127c3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612dc657888601518255948401946001909101908401612da7565b5085821015612e0257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516124c2818460208701612094565b600060208284031215612e3657600080fd5b81516116c481612b8e565b8181038181111561036e5761036e6128e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI @@ -218,28 +218,6 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) GetMessageContents(messageId [32 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") @@ -284,6 +262,28 @@ func (_CCIPReceiver *CCIPReceiverCallerSession) IsApprovedSender(sourceChainSele return _CCIPReceiver.Contract.IsApprovedSender(&_CCIPReceiver.CallOpts, sourceChainSelector, senderAddr) } +func (_CCIPReceiver *CCIPReceiverCaller) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) { + var out []interface{} + err := _CCIPReceiver.contract.Call(opts, &out, "isFailedMessage", messageId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPReceiver *CCIPReceiverSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPReceiver.Contract.IsFailedMessage(&_CCIPReceiver.CallOpts, messageId) +} + +func (_CCIPReceiver *CCIPReceiverCallerSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPReceiver.Contract.IsFailedMessage(&_CCIPReceiver.CallOpts, messageId) +} + func (_CCIPReceiver *CCIPReceiverCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _CCIPReceiver.contract.Call(opts, &out, "owner") @@ -444,18 +444,6 @@ func (_CCIPReceiver *CCIPReceiverTransactorSession) UpdateRouter(newRouter commo return _CCIPReceiver.Contract.UpdateRouter(&_CCIPReceiver.TransactOpts, newRouter) } -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) } @@ -2163,12 +2151,12 @@ func (_CCIPReceiver *CCIPReceiver) Address() common.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) + IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) + Owner(opts *bind.CallOpts) (common.Address, error) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, @@ -2193,8 +2181,6 @@ type CCIPReceiverInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 2c04c26098..2811c796a5 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -48,8 +48,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\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162002710380380620027108339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61251280620001fe6000396000f3fe6080604052600436106100cb5760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc3214610248578063effde24014610268578063f2fde38b1461028957600080fd5b80638da5cb5b146101b15780639fe74e26146101fd578063b0f479a11461021d57600080fd5b80635e35359e116100a55780635e35359e1461015c57806379ba50971461017c5780638462a2b91461019157600080fd5b80630e958d6b146100d757806335f170ef1461010c578063536c6bfa1461013a57600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b506100f76100f2366004611c07565b6102a9565b60405190151581526020015b60405180910390f35b34801561011857600080fd5b5061012c610127366004611c5a565b6102f4565b604051610103929190611cea565b34801561014657600080fd5b5061015a610155366004611d3a565b610420565b005b34801561016857600080fd5b5061015a610177366004611d71565b610484565b34801561018857600080fd5b5061015a610519565b34801561019d57600080fd5b5061015a6101ac366004611df7565b61061b565b3480156101bd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610103565b34801561020957600080fd5b5061015a610218366004611e63565b61095c565b34801561022957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101d8565b34801561025457600080fd5b5061015a610263366004611ea5565b610cf2565b61027b610276366004611ec2565b610dbe565b604051908152602001610103565b34801561029557600080fd5b5061015a6102a4366004611ea5565b61131c565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102d89085908590611f83565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061030f90611f93565b80601f016020809104026020016040519081016040528092919081815260200182805461033b90611f93565b80156103885780601f1061035d57610100808354040283529160200191610388565b820191906000526020600020905b81548152906001019060200180831161036b57829003601f168201915b50505050509080600101805461039d90611f93565b80601f01602080910402602001604051908101604052809291908181526020018280546103c990611f93565b80156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905082565b610428611330565b61043282826113b3565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b61048c611330565b6104ad73ffffffffffffffffffffffffffffffffffffffff8416838361150d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161050c91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461059f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610623611330565b60005b818110156107b6576003600084848481811061064457610644611fe6565b90506020028101906106569190612015565b610664906020810190611c5a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061069b5761069b611fe6565b90506020028101906106ad9190612015565b6106bb906020810190612053565b6040516106c9929190611f83565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061071057610710611fe6565b90506020028101906107229190612015565b610730906020810190612053565b60405161073e929190611f83565b604051809103902083838381811061075857610758611fe6565b905060200281019061076a9190612015565b610778906020810190611c5a565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610626565b5060005b83811015610955576001600360008787858181106107da576107da611fe6565b90506020028101906107ec9190612015565b6107fa906020810190611c5a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061083157610831611fe6565b90506020028101906108439190612015565b610851906020810190612053565b60405161085f929190611f83565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106108af576108af611fe6565b90506020028101906108c19190612015565b6108cf906020810190612053565b6040516108dd929190611f83565b60405180910390208585838181106108f7576108f7611fe6565b90506020028101906109099190612015565b610917906020810190611c5a565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016107ba565b5050505050565b610964611330565b60005b81811015610ced5782828281811061098157610981611fe6565b905060200281019061099391906120b8565b6109a49060408101906020016120fa565b610a7057600360008484848181106109be576109be611fe6565b90506020028101906109d091906120b8565b6109de906020810190611c5a565b67ffffffffffffffff16815260208101919091526040016000908120610a0391611b53565b828282818110610a1557610a15611fe6565b9050602002810190610a2791906120b8565b610a35906020810190611c5a565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2610ce5565b828282818110610a8257610a82611fe6565b9050602002810190610a9491906120b8565b610aa2906040810190612053565b9050600003610add576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060036000858585818110610af557610af5611fe6565b9050602002810190610b0791906120b8565b610b15906020810190611c5a565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110610b4b57610b4b611fe6565b9050602002810190610b5d91906120b8565b610b6b906040810190612053565b8291610b78919083612196565b50838383818110610b8b57610b8b611fe6565b9050602002810190610b9d91906120b8565b610bab906060810190612053565b159050610bf657838383818110610bc457610bc4611fe6565b9050602002810190610bd691906120b8565b610be4906060810190612053565b6001830191610bf4919083612196565b505b838383818110610c0857610c08611fe6565b9050602002810190610c1a91906120b8565b610c28906040810190612053565b604051610c36929190611f83565b6040518091039020848484818110610c5057610c50611fe6565b9050602002810190610c6291906120b8565b610c70906020810190611c5a565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110610cad57610cad611fe6565b9050602002810190610cbf91906120b8565b610ccd906060810190612053565b604051610cdb9291906122b0565b60405180910390a3505b600101610967565b505050565b610cfa611330565b73ffffffffffffffffffffffffffffffffffffffff8116610d47576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff8616600090815260036020526040812080548891908190610de790611f93565b9050600003610e2e576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610596565b6040805160a08101825267ffffffffffffffff8b16600090815260036020529182208054829190610e5e90611f93565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a90611f93565b8015610ed75780601f10610eac57610100808354040283529160200191610ed7565b820191906000526020600020905b815481529060010190602001808311610eba57829003601f168201915b5050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208e8102820181019092528d815293810193928e92508d9182919085015b82821015610f6757610f58604083028601368190038101906122fd565b81526020019060010190610f3b565b505050505081526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008d67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610fc290611f93565b80601f0160208091040260200160405190810160405280929190818152602001828054610fee90611f93565b801561103b5780601f106110105761010080835404028352916020019161103b565b820191906000526020600020905b81548152906001019060200180831161101e57829003601f168201915b5050505050815250905060005b8881101561113d576110b733308c8c8581811061106757611067611fe6565b905060400201602001358d8d8681811061108357611083611fe6565b6110999260206040909202019081019150611ea5565b73ffffffffffffffffffffffffffffffffffffffff169291906115e1565b6002546111359073ffffffffffffffffffffffffffffffffffffffff168b8b848181106110e6576110e6611fe6565b905060400201602001358c8c8581811061110257611102611fe6565b6111189260206040909202019081019150611ea5565b73ffffffffffffffffffffffffffffffffffffffff169190611645565b600101611048565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611197908e908690600401612355565b602060405180830381865afa1580156111b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d8919061246a565b905073ffffffffffffffffffffffffffffffffffffffff86161561123f5761121873ffffffffffffffffffffffffffffffffffffffff87163330846115e1565b60025461123f9073ffffffffffffffffffffffffffffffffffffffff888116911683611645565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f99088161561126f576000611271565b825b8d856040518463ffffffff1660e01b8152600401611290929190612355565b60206040518083038185885af11580156112ae573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112d3919061246a565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161130691815260200190565b60405180910390a1505050509695505050505050565b611324611330565b61132d81611743565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610596565b565b8047101561141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610596565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611477576040519150601f19603f3d011682016040523d82523d6000602084013e61147c565b606091505b5050905080610ced576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610596565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ced9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611838565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261163f9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161155f565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156116bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e0919061246a565b6116ea9190612483565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061163f9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161155f565b3373ffffffffffffffffffffffffffffffffffffffff8216036117c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610596565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061189a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166119449092919063ffffffff16565b805190915015610ced57808060200190518101906118b891906124c3565b610ced576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610596565b6060611953848460008561195b565b949350505050565b6060824710156119ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610596565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611a1691906124e0565b60006040518083038185875af1925050503d8060008114611a53576040519150601f19603f3d011682016040523d82523d6000602084013e611a58565b606091505b5091509150611a6987838387611a74565b979650505050505050565b60608315611b0a578251600003611b035773ffffffffffffffffffffffffffffffffffffffff85163b611b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610596565b5081611953565b6119538383815115611b1f5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059691906124f2565b508054611b5f90611f93565b6000825580601f10611b6f575050565b601f01602090049060005260206000209081019061132d91905b80821115611b9d5760008155600101611b89565b5090565b803567ffffffffffffffff81168114611bb957600080fd5b919050565b60008083601f840112611bd057600080fd5b50813567ffffffffffffffff811115611be857600080fd5b602083019150836020828501011115611c0057600080fd5b9250929050565b600080600060408486031215611c1c57600080fd5b611c2584611ba1565b9250602084013567ffffffffffffffff811115611c4157600080fd5b611c4d86828701611bbe565b9497909650939450505050565b600060208284031215611c6c57600080fd5b611c7582611ba1565b9392505050565b60005b83811015611c97578181015183820152602001611c7f565b50506000910152565b60008151808452611cb8816020860160208601611c7c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611cfd6040830185611ca0565b8281036020840152611d0f8185611ca0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461132d57600080fd5b60008060408385031215611d4d57600080fd5b8235611d5881611d18565b946020939093013593505050565b8035611bb981611d18565b600080600060608486031215611d8657600080fd5b8335611d9181611d18565b92506020840135611da181611d18565b929592945050506040919091013590565b60008083601f840112611dc457600080fd5b50813567ffffffffffffffff811115611ddc57600080fd5b6020830191508360208260051b8501011115611c0057600080fd5b60008060008060408587031215611e0d57600080fd5b843567ffffffffffffffff80821115611e2557600080fd5b611e3188838901611db2565b90965094506020870135915080821115611e4a57600080fd5b50611e5787828801611db2565b95989497509550505050565b60008060208385031215611e7657600080fd5b823567ffffffffffffffff811115611e8d57600080fd5b611e9985828601611db2565b90969095509350505050565b600060208284031215611eb757600080fd5b8135611c7581611d18565b60008060008060008060808789031215611edb57600080fd5b611ee487611ba1565b9550602087013567ffffffffffffffff80821115611f0157600080fd5b818901915089601f830112611f1557600080fd5b813581811115611f2457600080fd5b8a60208260061b8501011115611f3957600080fd5b602083019750809650506040890135915080821115611f5757600080fd5b50611f6489828a01611bbe565b9094509250611f77905060608801611d66565b90509295509295509295565b8183823760009101908152919050565b600181811c90821680611fa757607f821691505b602082108103611fe0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261204957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261208857600080fd5b83018035915067ffffffffffffffff8211156120a357600080fd5b602001915036819003821315611c0057600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261204957600080fd5b801515811461132d57600080fd5b60006020828403121561210c57600080fd5b8135611c75816120ec565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115610ced576000816000526020600020601f850160051c8101602086101561216f5750805b601f850160051c820191505b8181101561218e5782815560010161217b565b505050505050565b67ffffffffffffffff8311156121ae576121ae612117565b6121c2836121bc8354611f93565b83612146565b6000601f84116001811461221457600085156121de5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610955565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156122635786850135825560209485019460019092019101612243565b508682101561229e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006040828403121561230f57600080fd5b6040516040810181811067ffffffffffffffff8211171561233257612332612117565b604052823561234081611d18565b81526020928301359281019290925250919050565b6000604067ffffffffffffffff851683526020604081850152845160a0604086015261238460e0860182611ca0565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526123bf8383611ca0565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612420578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019390930192908601906123e1565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061245c8187611ca0565b9a9950505050505050505050565b60006020828403121561247c57600080fd5b5051919050565b808201808211156124bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156124d557600080fd5b8151611c75816120ec565b60008251612049818460208701611c7c565b602081526000611c756020830184611ca056fea164736f6c6343000818000a", + 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\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162002547380380620025478339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61234980620001fe6000396000f3fe6080604052600436106100c05760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc321461021d578063effde2401461023d578063f2fde38b1461025e57600080fd5b80638da5cb5b146101865780639fe74e26146101d2578063b0f479a1146101f257600080fd5b80635e35359e116100a55780635e35359e1461012f57806379ba5097146101515780638462a2b91461016657600080fd5b80630e958d6b146100cc57806335f170ef1461010157600080fd5b366100c757005b600080fd5b3480156100d857600080fd5b506100ec6100e73660046118f9565b61027e565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b5061012161011c36600461197c565b6102c9565b6040516100f8929190611a0c565b34801561013b57600080fd5b5061014f61014a366004611a5e565b6103f5565b005b34801561015d57600080fd5b5061014f6104ca565b34801561017257600080fd5b5061014f610181366004611ae6565b6105cc565b34801561019257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b3480156101de57600080fd5b5061014f6101ed366004611b52565b61090d565b3480156101fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101ad565b34801561022957600080fd5b5061014f610238366004611b94565b610aaf565b61025061024b366004611ce4565b610b7b565b6040519081526020016100f8565b34801561026a57600080fd5b5061014f610279366004611b94565b611057565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102ad9085908590611dfe565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906102e490611e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461031090611e0e565b801561035d5780601f106103325761010080835404028352916020019161035d565b820191906000526020600020905b81548152906001019060200180831161034057829003601f168201915b50505050509080600101805461037290611e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461039e90611e0e565b80156103eb5780601f106103c0576101008083540402835291602001916103eb565b820191906000526020600020905b8154815290600101906020018083116103ce57829003601f168201915b5050505050905082565b6103fd61106b565b73ffffffffffffffffffffffffffffffffffffffff831661043d5761043873ffffffffffffffffffffffffffffffffffffffff8316826110ee565b61045e565b61045e73ffffffffffffffffffffffffffffffffffffffff84168383611248565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516104bd91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105d461106b565b60005b8181101561076757600360008484848181106105f5576105f5611e61565b90506020028101906106079190611e90565b61061590602081019061197c565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061064c5761064c611e61565b905060200281019061065e9190611e90565b61066c906020810190611ece565b60405161067a929190611dfe565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106106c1576106c1611e61565b90506020028101906106d39190611e90565b6106e1906020810190611ece565b6040516106ef929190611dfe565b604051809103902083838381811061070957610709611e61565b905060200281019061071b9190611e90565b61072990602081019061197c565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016105d7565b5060005b838110156109065760016003600087878581811061078b5761078b611e61565b905060200281019061079d9190611e90565b6107ab90602081019061197c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106107e2576107e2611e61565b90506020028101906107f49190611e90565b610802906020810190611ece565b604051610810929190611dfe565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061086057610860611e61565b90506020028101906108729190611e90565b610880906020810190611ece565b60405161088e929190611dfe565b60405180910390208585838181106108a8576108a8611e61565b90506020028101906108ba9190611e90565b6108c890602081019061197c565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161076b565b5050505050565b61091561106b565b60005b81811015610aaa57600083838381811061093457610934611e61565b90506020028101906109469190611f33565b61094f90611f75565b905080602001516109ba57805167ffffffffffffffff16600090815260036020526040812061097d9161188e565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2610aa1565b8060400151516000036109f9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff1660009081526003602052604090819020908201518190610a259082612072565b5060608201516001820190610a3a9082612072565b508160400151604051610a4d919061218c565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128460600151604051610a97919061219e565b60405180910390a3505b50600101610918565b505050565b610ab761106b565b73ffffffffffffffffffffffffffffffffffffffff8116610b04576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff8416600090815260036020526040812080548691908190610ba490611e0e565b9050600003610beb576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610547565b6040805160a08101825267ffffffffffffffff8916600090815260036020529182208054829190610c1b90611e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4790611e0e565b8015610c945780601f10610c6957610100808354040283529160200191610c94565b820191906000526020600020905b815481529060010190602001808311610c7757829003601f168201915b505050505081526020018781526020018881526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610cfb90611e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2790611e0e565b8015610d745780601f10610d4957610100808354040283529160200191610d74565b820191906000526020600020905b815481529060010190602001808311610d5757829003601f168201915b5050505050815250905060005b8751811015610e7a57610df133308a8481518110610da157610da1611e61565b6020026020010151602001518b8581518110610dbf57610dbf611e61565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661131c909392919063ffffffff16565b6002548851610e729173ffffffffffffffffffffffffffffffffffffffff16908a9084908110610e2357610e23611e61565b6020026020010151602001518a8481518110610e4157610e41611e61565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166113809092919063ffffffff16565b600101610d81565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90610ed4908c9086906004016121b1565b602060405180830381865afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906122c6565b905073ffffffffffffffffffffffffffffffffffffffff861615610f7c57610f5573ffffffffffffffffffffffffffffffffffffffff871633308461131c565b600254610f7c9073ffffffffffffffffffffffffffffffffffffffff888116911683611380565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f990881615610fac576000610fae565b825b8b856040518463ffffffff1660e01b8152600401610fcd9291906121b1565b60206040518083038185885af1158015610feb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061101091906122c6565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161104391815260200190565b60405180910390a150505050949350505050565b61105f61106b565b6110688161147e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610547565b565b80471015611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610547565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b5050905080610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610547565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aaa9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611573565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261137a9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161129a565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156113f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141b91906122c6565b61142591906122df565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061137a9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161129a565b3373ffffffffffffffffffffffffffffffffffffffff8216036114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610547565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006115d5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661167f9092919063ffffffff16565b805190915015610aaa57808060200190518101906115f3919061231f565b610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610547565b606061168e8484600085611696565b949350505050565b606082471015611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610547565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611751919061218c565b60006040518083038185875af1925050503d806000811461178e576040519150601f19603f3d011682016040523d82523d6000602084013e611793565b606091505b50915091506117a4878383876117af565b979650505050505050565b6060831561184557825160000361183e5773ffffffffffffffffffffffffffffffffffffffff85163b61183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610547565b508161168e565b61168e838381511561185a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610547919061219e565b50805461189a90611e0e565b6000825580601f106118aa575050565b601f01602090049060005260206000209081019061106891905b808211156118d857600081556001016118c4565b5090565b803567ffffffffffffffff811681146118f457600080fd5b919050565b60008060006040848603121561190e57600080fd5b611917846118dc565b9250602084013567ffffffffffffffff8082111561193457600080fd5b818601915086601f83011261194857600080fd5b81358181111561195757600080fd5b87602082850101111561196957600080fd5b6020830194508093505050509250925092565b60006020828403121561198e57600080fd5b611997826118dc565b9392505050565b60005b838110156119b95781810151838201526020016119a1565b50506000910152565b600081518084526119da81602086016020860161199e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a1f60408301856119c2565b8281036020840152611a3181856119c2565b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146118f457600080fd5b600080600060608486031215611a7357600080fd5b611a7c84611a3a565b9250611a8a60208501611a3a565b9150604084013590509250925092565b60008083601f840112611aac57600080fd5b50813567ffffffffffffffff811115611ac457600080fd5b6020830191508360208260051b8501011115611adf57600080fd5b9250929050565b60008060008060408587031215611afc57600080fd5b843567ffffffffffffffff80821115611b1457600080fd5b611b2088838901611a9a565b90965094506020870135915080821115611b3957600080fd5b50611b4687828801611a9a565b95989497509550505050565b60008060208385031215611b6557600080fd5b823567ffffffffffffffff811115611b7c57600080fd5b611b8885828601611a9a565b90969095509350505050565b600060208284031215611ba657600080fd5b61199782611a3a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c0157611c01611baf565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c4e57611c4e611baf565b604052919050565b600082601f830112611c6757600080fd5b813567ffffffffffffffff811115611c8157611c81611baf565b611cb260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c07565b818152846020838601011115611cc757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611cfa57600080fd5b611d03856118dc565b935060208086013567ffffffffffffffff80821115611d2157600080fd5b818801915088601f830112611d3557600080fd5b813581811115611d4757611d47611baf565b611d55848260051b01611c07565b81815260069190911b8301840190848101908b831115611d7457600080fd5b938501935b82851015611dbe576040858d031215611d925760008081fd5b611d9a611bde565b611da386611a3a565b81528587013587820152825260409094019390850190611d79565b975050506040880135925080831115611dd657600080fd5b5050611de487828801611c56565b925050611df360608601611a3a565b905092959194509250565b8183823760009101908152919050565b600181811c90821680611e2257607f821691505b602082108103611e5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611ec457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f0357600080fd5b83018035915067ffffffffffffffff821115611f1e57600080fd5b602001915036819003821315611adf57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611ec457600080fd5b801515811461106857600080fd5b600060808236031215611f8757600080fd5b6040516080810167ffffffffffffffff8282108183111715611fab57611fab611baf565b81604052611fb8856118dc565b835260208501359150611fca82611f67565b8160208401526040850135915080821115611fe457600080fd5b611ff036838701611c56565b6040840152606085013591508082111561200957600080fd5b5061201636828601611c56565b60608301525092915050565b601f821115610aaa576000816000526020600020601f850160051c8101602086101561204b5750805b601f850160051c820191505b8181101561206a57828155600101612057565b505050505050565b815167ffffffffffffffff81111561208c5761208c611baf565b6120a08161209a8454611e0e565b84612022565b602080601f8311600181146120f357600084156120bd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561206a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561214057888601518255948401946001909101908401612121565b508582101561217c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611ec481846020870161199e565b60208152600061199760208301846119c2565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526121e060e08601826119c2565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261221b83836119c2565b6040890151888203830160808a01528051808352908601945060009350908501905b8084101561227c578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600193909301929086019061223d565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506122b881876119c2565b9a9950505050505050505050565b6000602082840312156122d857600080fd5b5051919050565b80820180821115612319577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561233157600080fd5b815161199781611f6756fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -356,18 +356,6 @@ func (_CCIPSender *CCIPSenderTransactorSession) UpdateRouter(newRouter common.Ad return _CCIPSender.Contract.UpdateRouter(&_CCIPSender.TransactOpts, newRouter) } -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) } @@ -1807,8 +1795,6 @@ type CCIPSenderInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(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 eb1c1f3732..92d50f5f6a 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004b6138038062004b618339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b61449780620006ca6000396000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063e4ca875411610064578063e4ca8754146105c5578063e89b4485146105e5578063f2fde38b146105f8578063ff2deec31461061857600080fd5b8063bee518a41461051a578063c851cc3214610565578063c89245d514610585578063cf6730f8146105a557600080fd5b80639fe74e26116100d15780639fe74e261461047f578063b0f479a11461049f578063b187bd26146104ca578063b5a11011146104fa57600080fd5b806385572ffb146104145780638da5cb5b146104345780639d2aede51461045f57600080fd5b80635075a9d4116101645780636939cd971161013e5780636939cd97146103925780636d62d633146103bf57806379ba5097146103df5780638462a2b9146103f457600080fd5b80635075a9d414610324578063536c6bfa146103525780635e35359e1461037257600080fd5b80631892b906116101a05780631892b906146102755780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630e958d6b146101d257806316c38b3c14610207578063181f5a771461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed3660046133ee565b610645565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50610227610222366004613481565b610690565b005b34801561023557600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e332e300000000000000000000000000000602082015290516101fe919061350c565b34801561028157600080fd5b5061022761029036600461351f565b6106e2565b3480156102a157600080fd5b5061022761073d565b3480156102b657600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b5061031661031136600461351f565b610779565b6040516101fe92919061353c565b34801561033057600080fd5b5061034461033f36600461356a565b6108a5565b6040519081526020016101fe565b34801561035e57600080fd5b5061022761036d3660046135a5565b6108b8565b34801561037e57600080fd5b5061022761038d3660046135d1565b61091c565b34801561039e57600080fd5b506103b26103ad36600461356a565b6109b1565b6040516101fe919061366f565b3480156103cb57600080fd5b506102276103da366004613703565b610bbc565b3480156103eb57600080fd5b50610227610ed6565b34801561040057600080fd5b5061022761040f36600461377f565b610fd3565b34801561042057600080fd5b5061022761042f3660046137eb565b611314565b34801561044057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561046b57600080fd5b5061022761047a366004613826565b61151d565b34801561048b57600080fd5b5061022761049a366004613843565b6115e2565b3480156104ab57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104d657600080fd5b5060095474010000000000000000000000000000000000000000900460ff166101f2565b34801561050657600080fd5b50610227610515366004613885565b611973565b34801561052657600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561057157600080fd5b50610227610580366004613826565b611b19565b34801561059157600080fd5b506102276105a0366004613826565b611be5565b3480156105b157600080fd5b506102276105c03660046137eb565b611d4f565b3480156105d157600080fd5b506102276105e036600461356a565b611ee5565b6103446105f33660046139e8565b61214f565b34801561060457600080fd5b50610227610613366004613826565b6126fd565b34801561062457600080fd5b506008546102d19073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106749085908590613af5565b9081526040519081900360200190205460ff1690509392505050565b610698612711565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106ea612711565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610745612711565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107776001612792565b565b60036020526000908152604090208054819061079490613b05565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090613b05565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509080600101805461082290613b05565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613b05565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905082565b60006108b26005836128b6565b92915050565b6108c0612711565b6108ca82826128c9565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b610924612711565b61094573ffffffffffffffffffffffffffffffffffffffff84168383612a23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a2090613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90613b05565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b05565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b59565b505050915250909392505050565b610bc4612711565b6001610bd16005846128b6565b14610c10576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610c208260025b60059190612af7565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610c6890613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9490613b05565b8015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b50505050508152602001600382018054610cfa90613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2690613b05565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610df65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610da1565b5050505081525050905060005b816080015151811015610e8557610e7d8383608001518381518110610e2a57610e2a613b58565b60200260200101516020015184608001518481518110610e4c57610e4c613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a239092919063ffffffff16565b600101610e03565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c07565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fdb612711565b60005b8181101561116e5760036000848484818110610ffc57610ffc613b58565b905060200281019061100e9190613b87565b61101c90602081019061351f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061105357611053613b58565b90506020028101906110659190613b87565b611073906020810190613bc5565b604051611081929190613af5565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106110c8576110c8613b58565b90506020028101906110da9190613b87565b6110e8906020810190613bc5565b6040516110f6929190613af5565b604051809103902083838381811061111057611110613b58565b90506020028101906111229190613b87565b61113090602081019061351f565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610fde565b5060005b8381101561130d5760016003600087878581811061119257611192613b58565b90506020028101906111a49190613b87565b6111b290602081019061351f565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106111e9576111e9613b58565b90506020028101906111fb9190613b87565b611209906020810190613bc5565b604051611217929190613af5565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061126757611267613b58565b90506020028101906112799190613b87565b611287906020810190613bc5565b604051611295929190613af5565b60405180910390208585838181106112af576112af613b58565b90506020028101906112c19190613b87565b6112cf90602081019061351f565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611172565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611367576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c07565b611377604082016020830161351f565b67ffffffffffffffff811660009081526003602052604090208054819061139d90613b05565b90506000036113e4576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611420908690600401613d2c565b600060405180830381600087803b15801561143a57600080fd5b505af192505050801561144b575060015b6114eb573d808015611479576040519150601f19603f3d011682016040523d82523d6000602084013e61147e565b606091505b5061148b84356001610c17565b508335600090815260046020526040902084906114a88282614106565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906114dd90849061350c565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611525612711565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff166000908152600360205220906115de9082614200565b5050565b6115ea612711565b60005b818110156115185782828281811061160757611607613b58565b9050602002810190611619919061431a565b61162a906040810190602001613481565b6116f6576003600084848481811061164457611644613b58565b9050602002810190611656919061431a565b61166490602081019061351f565b67ffffffffffffffff168152602081019190915260400160009081206116899161338a565b82828281811061169b5761169b613b58565b90506020028101906116ad919061431a565b6116bb90602081019061351f565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a261196b565b82828281811061170857611708613b58565b905060200281019061171a919061431a565b611728906040810190613bc5565b9050600003611763576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061177b5761177b613b58565b905060200281019061178d919061431a565b61179b90602081019061351f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106117d1576117d1613b58565b90506020028101906117e3919061431a565b6117f1906040810190613bc5565b82916117fe919083613e8a565b5083838381811061181157611811613b58565b9050602002810190611823919061431a565b611831906060810190613bc5565b15905061187c5783838381811061184a5761184a613b58565b905060200281019061185c919061431a565b61186a906060810190613bc5565b600183019161187a919083613e8a565b505b83838381811061188e5761188e613b58565b90506020028101906118a0919061431a565b6118ae906040810190613bc5565b6040516118bc929190613af5565b60405180910390208484848181106118d6576118d6613b58565b90506020028101906118e8919061431a565b6118f690602081019061351f565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061193357611933613b58565b9050602002810190611945919061431a565b611953906060810190613bc5565b60405161196192919061434e565b60405180910390a3505b6001016115ed565b61197b612711565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611a6c91614362565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115189082614200565b611b21612711565b73ffffffffffffffffffffffffffffffffffffffff8116611b6e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611bed612711565b60085473ffffffffffffffffffffffffffffffffffffffff1615611c4e57611c4e611c2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612b0c565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611cfb57611cfb611cbb60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c8e565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611d88576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d98604082016020830161351f565b611da56040830183613bc5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611dfc92509050613b05565b15905080611e525750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611e3d9190614362565b9081526040519081900360200190205460ff16155b15611e8b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c07919061350c565b6000611e9a6060850185613bc5565b810190611ea7919061356a565b60095490915074010000000000000000000000000000000000000000900460ff16611edf57611edf611eda826001614374565b612792565b50505050565b6001611ef26005836128b6565b14611f2c576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c07565b611f37816000610c17565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611f7f90613b05565b80601f0160208091040260200160405190810160405280929190818152602001828054611fab90613b05565b8015611ff85780601f10611fcd57610100808354040283529160200191611ff8565b820191906000526020600020905b815481529060010190602001808311611fdb57829003601f168201915b5050505050815260200160038201805461201190613b05565b80601f016020809104026020016040519081016040528092919081815260200182805461203d90613b05565b801561208a5780601f1061205f5761010080835404028352916020019161208a565b820191906000526020600020905b81548152906001019060200180831161206d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561210d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016120b8565b5050505081525050905061212081612d8c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061217890613b05565b90506000036121bf576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c07565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906121ef90613b05565b80601f016020809104026020016040519081016040528092919081815260200182805461221b90613b05565b80156122685780601f1061223d57610100808354040283529160200191612268565b820191906000526020600020905b81548152906001019060200180831161224b57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916122c990613b05565b80601f01602080910402602001604051908101604052809291908181526020018280546122f590613b05565b80156123425780601f1061231757610100808354040283529160200191612342565b820191906000526020600020905b81548152906001019060200180831161232557829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906123a9908b908690600401614387565b602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea9190614454565b60085490915073ffffffffffffffffffffffffffffffffffffffff16158015906124a357506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561247d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a19190614454565b105b156124cd576008546124cd9073ffffffffffffffffffffffffffffffffffffffff16333084612dfe565b60005b87518110156126205761254033308a84815181106124f0576124f0613b58565b6020026020010151602001518b858151811061250e5761250e613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612dfe909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061257057612570613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146126185760025488516126189173ffffffffffffffffffffffffffffffffffffffff16908a90849081106125c9576125c9613b58565b6020026020010151602001518a84815181106125e7576125e7613b58565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b0c9092919063ffffffff16565b6001016124d0565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612653576000612655565b825b8a856040518463ffffffff1660e01b8152600401612674929190614387565b60206040518083038185885af1158015612692573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126b79190614454565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516126ea91815260200190565b60405180910390a1505050509392505050565b612705612711565b61270e81612e5c565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c07565b806001166001036127d5576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612809565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161281e91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600854600080855260208501909352909350611518927401000000000000000000000000000000000000000090910467ffffffffffffffff16916128af565b60408051808201909152600080825260208201528152602001906001900390816128885790505b508361214f565b60006128c28383612f51565b9392505050565b80471015612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c07565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461298d576040519150601f19603f3d011682016040523d82523d6000602084013e612992565b606091505b5050905080611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612fdb565b6000612b048484846130e7565b949350505050565b801580612bac57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612baa9190614454565b155b612c38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c07565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115189084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a75565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d299190614454565b612d339190614374565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611edf9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a75565b612d94612711565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612dd090849060040161366f565b600060405180830381600087803b158015612dea57600080fd5b505af115801561130d573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611edf9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a75565b3373ffffffffffffffffffffffffffffffffffffffff821603612edb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c07565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260028301602052604081205480151580612f755750612f758484613104565b6128c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610c07565b600061303d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131109092919063ffffffff16565b805190915015611518578080602001905181019061305b919061446d565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c07565b60008281526002840160205260408120829055612b04848461311f565b60006128c2838361312b565b6060612b048484600085613143565b60006128c2838361325c565b600081815260018301602052604081205415156128c2565b6060824710156131d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c07565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131fe9190614362565b60006040518083038185875af1925050503d806000811461323b576040519150601f19603f3d011682016040523d82523d6000602084013e613240565b606091505b5091509150613251878383876132ab565b979650505050505050565b60008181526001830160205260408120546132a3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108b2565b5060006108b2565b6060831561334157825160000361333a5773ffffffffffffffffffffffffffffffffffffffff85163b61333a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c07565b5081612b04565b612b0483838151156133565781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07919061350c565b50805461339690613b05565b6000825580601f106133a6575050565b601f01602090049060005260206000209081019061270e91905b808211156133d457600081556001016133c0565b5090565b67ffffffffffffffff8116811461270e57600080fd5b60008060006040848603121561340357600080fd5b833561340e816133d8565b9250602084013567ffffffffffffffff8082111561342b57600080fd5b818601915086601f83011261343f57600080fd5b81358181111561344e57600080fd5b87602082850101111561346057600080fd5b6020830194508093505050509250925092565b801515811461270e57600080fd5b60006020828403121561349357600080fd5b81356128c281613473565b60005b838110156134b95781810151838201526020016134a1565b50506000910152565b600081518084526134da81602086016020860161349e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006128c260208301846134c2565b60006020828403121561353157600080fd5b81356128c2816133d8565b60408152600061354f60408301856134c2565b828103602084015261356181856134c2565b95945050505050565b60006020828403121561357c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461270e57600080fd5b600080604083850312156135b857600080fd5b82356135c381613583565b946020939093013593505050565b6000806000606084860312156135e657600080fd5b83356135f181613583565b9250602084013561360181613583565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613664578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613627565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526136a960c08401826134c2565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136e583836134c2565b925060808601519150808584030160a0860152506135618282613612565b6000806040838503121561371657600080fd5b82359150602083013561372881613583565b809150509250929050565b60008083601f84011261374557600080fd5b50813567ffffffffffffffff81111561375d57600080fd5b6020830191508360208260051b850101111561377857600080fd5b9250929050565b6000806000806040858703121561379557600080fd5b843567ffffffffffffffff808211156137ad57600080fd5b6137b988838901613733565b909650945060208701359150808211156137d257600080fd5b506137df87828801613733565b95989497509550505050565b6000602082840312156137fd57600080fd5b813567ffffffffffffffff81111561381457600080fd5b820160a081850312156128c257600080fd5b60006020828403121561383857600080fd5b81356128c281613583565b6000806020838503121561385657600080fd5b823567ffffffffffffffff81111561386d57600080fd5b61387985828601613733565b90969095509350505050565b6000806040838503121561389857600080fd5b82356138a3816133d8565b9150602083013561372881613583565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613905576139056138b3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613952576139526138b3565b604052919050565b600082601f83011261396b57600080fd5b813567ffffffffffffffff811115613985576139856138b3565b6139b660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161390b565b8181528460208386010111156139cb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156139fd57600080fd5b8335613a08816133d8565b925060208481013567ffffffffffffffff80821115613a2657600080fd5b818701915087601f830112613a3a57600080fd5b813581811115613a4c57613a4c6138b3565b613a5a848260051b0161390b565b81815260069190911b8301840190848101908a831115613a7957600080fd5b938501935b82851015613ac5576040858c031215613a975760008081fd5b613a9f6138e2565b8535613aaa81613583565b81528587013587820152825260409094019390850190613a7e565b965050506040870135925080831115613add57600080fd5b5050613aeb8682870161395a565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613b1957607f821691505b602082108103613b52577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613bbb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613bfa57600080fd5b83018035915067ffffffffffffffff821115613c1557600080fd5b60200191503681900382131561377857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c5f57600080fd5b830160208101925035905067ffffffffffffffff811115613c7f57600080fd5b80360382131561377857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613664578135613cfa81613583565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613ce7565b602081528135602082015260006020830135613d47816133d8565b67ffffffffffffffff8082166040850152613d656040860186613c2a565b925060a06060860152613d7c60c086018483613c8e565b925050613d8c6060860186613c2a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613dc2858385613c8e565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613dfb57600080fd5b60209288019283019235915083821115613e1457600080fd5b8160061b3603831315613e2657600080fd5b8685030160a0870152613251848284613cd7565b601f821115611518576000816000526020600020601f850160051c81016020861015613e635750805b601f850160051c820191505b81811015613e8257828155600101613e6f565b505050505050565b67ffffffffffffffff831115613ea257613ea26138b3565b613eb683613eb08354613b05565b83613e3a565b6000601f841160018114613f085760008515613ed25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561130d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f575786850135825560209485019460019092019101613f37565b5086821015613f92577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613fde81613583565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115614044576140446138b3565b8054838255808410156140d15760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461408557614085613fa4565b808616861461409657614096613fa4565b5060008360005260206000208360011b81018760011b820191505b808210156140cc5782825582848301556002820191506140b1565b505050505b5060008181526020812083915b85811015613e82576140f08383613fd3565b60409290920191600291909101906001016140de565b8135815560018101602083013561411c816133d8565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561415c6040860186613bc5565b9350915061416e838360028701613e8a565b61417b6060860186613bc5565b9350915061418d838360038701613e8a565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126141c457600080fd5b9184019182359150808211156141d957600080fd5b506020820191508060061b36038213156141f257600080fd5b611edf81836004860161402b565b815167ffffffffffffffff81111561421a5761421a6138b3565b61422e816142288454613b05565b84613e3a565b602080601f831160018114614281576000841561424b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142ce578886015182559484019460019091019084016142af565b508582101561430a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613bbb57600080fd5b602081526000612b04602083018486613c8e565b60008251613bbb81846020870161349e565b808201808211156108b2576108b2613fa4565b67ffffffffffffffff83168152604060208201526000825160a060408401526143b360e08401826134c2565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526143ef83836134c2565b9250604086015191508085840301608086015261440c8383613612565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061444a82826134c2565b9695505050505050565b60006020828403121561446657600080fd5b5051919050565b60006020828403121561447f57600080fd5b81516128c28161347356fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620048ac380380620048ac8339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556007805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b6141e280620006ca6000396000f3fe6080604052600436106101a55760003560e01c80638da5cb5b116100e1578063c851cc321161008a578063e4ca875411610064578063e4ca875414610536578063e89b448514610556578063f2fde38b14610577578063ff2deec31461059757600080fd5b8063c851cc32146104d6578063c89245d5146104f6578063cf6730f81461051657600080fd5b8063b187bd26116100bb578063b187bd261461043b578063b5a110111461046b578063bee518a41461048b57600080fd5b80638da5cb5b146103c55780639fe74e26146103f0578063b0f479a11461041057600080fd5b806335f170ef1161014e5780636d62d633116101285780636d62d6331461035057806379ba5097146103705780638462a2b91461038557806385572ffb146103a557600080fd5b806335f170ef146102d55780635e35359e146103035780636939cd971461032357600080fd5b8063181f5a771161017f578063181f5a77146102285780632874d8bf146102745780632b6e5d631461028957600080fd5b80630a9094dc146101b15780630e958d6b146101e657806316c38b3c1461020657600080fd5b366101ac57005b600080fd5b3480156101bd57600080fd5b506101d16101cc366004613070565b6105c4565b60405190151581526020015b60405180910390f35b3480156101f257600080fd5b506101d161020136600461309f565b6105d7565b34801561021257600080fd5b50610226610221366004613132565b610622565b005b34801561023457600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e362e300000000000000000000000000000602082015290516101dd91906131bd565b34801561028057600080fd5b50610226610674565b34801561029557600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b3480156102e157600080fd5b506102f56102f03660046131d0565b6106b0565b6040516101dd9291906131ed565b34801561030f57600080fd5b5061022661031e36600461323d565b6107dc565b34801561032f57600080fd5b5061034361033e366004613070565b6108b1565b6040516101dd91906132db565b34801561035c57600080fd5b5061022661036b36600461336f565b610abc565b34801561037c57600080fd5b50610226610cd3565b34801561039157600080fd5b506102266103a03660046133eb565b610dd0565b3480156103b157600080fd5b506102266103c0366004613457565b611111565b3480156103d157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102b0565b3480156103fc57600080fd5b5061022661040b366004613492565b61131a565b34801561041c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102b0565b34801561044757600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101d1565b34801561047757600080fd5b506102266104863660046134d4565b6114b7565b34801561049757600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101dd565b3480156104e257600080fd5b506102266104f1366004613502565b6116bf565b34801561050257600080fd5b50610226610511366004613502565b61178b565b34801561052257600080fd5b50610226610531366004613457565b6118f5565b34801561054257600080fd5b50610226610551366004613070565b611a80565b610569610564366004613654565b611d4e565b6040519081526020016101dd565b34801561058357600080fd5b50610226610592366004613502565b6122fc565b3480156105a357600080fd5b506007546102b09073ffffffffffffffffffffffffffffffffffffffff1681565b60006105d1600583612310565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106069085908590613761565b9081526040519081900360200190205460ff1690509392505050565b61062a61232b565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61067c61232b565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556106ae60016123ac565b565b6003602052600090815260409020805481906106cb90613771565b80601f01602080910402602001604051908101604052809291908181526020018280546106f790613771565b80156107445780601f1061071957610100808354040283529160200191610744565b820191906000526020600020905b81548152906001019060200180831161072757829003601f168201915b50505050509080600101805461075990613771565b80601f016020809104026020016040519081016040528092919081815260200182805461078590613771565b80156107d25780601f106107a7576101008083540402835291602001916107d2565b820191906000526020600020905b8154815290600101906020018083116107b557829003601f168201915b5050505050905082565b6107e461232b565b73ffffffffffffffffffffffffffffffffffffffff83166108245761081f73ffffffffffffffffffffffffffffffffffffffff8316826124d0565b610845565b61084573ffffffffffffffffffffffffffffffffffffffff8416838361262a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516108a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161092090613771565b80601f016020809104026020016040519081016040528092919081815260200182805461094c90613771565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b505050505081526020016003820180546109b290613771565b80601f01602080910402602001604051908101604052809291908181526020018280546109de90613771565b8015610a2b5780601f10610a0057610100808354040283529160200191610a2b565b820191906000526020600020905b815481529060010190602001808311610a0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610aae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a59565b505050915250909392505050565b610ac461232b565b610acf600583612310565b610b0d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610b8e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b39565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610bde6002830182612fbe565b610bec600383016000612fbe565b610bfa600483016000612ff8565b50610c0890506005846126fe565b5060005b8151811015610c8257610c7a83838381518110610c2b57610c2b6137c4565b602002602001015160200151848481518110610c4957610c496137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661262a9092919063ffffffff16565b600101610c0c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b04565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610dd861232b565b60005b81811015610f6b5760036000848484818110610df957610df96137c4565b9050602002810190610e0b91906137f3565b610e199060208101906131d0565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e5057610e506137c4565b9050602002810190610e6291906137f3565b610e70906020810190613831565b604051610e7e929190613761565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ec557610ec56137c4565b9050602002810190610ed791906137f3565b610ee5906020810190613831565b604051610ef3929190613761565b6040518091039020838383818110610f0d57610f0d6137c4565b9050602002810190610f1f91906137f3565b610f2d9060208101906131d0565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ddb565b5060005b8381101561110a57600160036000878785818110610f8f57610f8f6137c4565b9050602002810190610fa191906137f3565b610faf9060208101906131d0565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fe657610fe66137c4565b9050602002810190610ff891906137f3565b611006906020810190613831565b604051611014929190613761565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110611064576110646137c4565b905060200281019061107691906137f3565b611084906020810190613831565b604051611092929190613761565b60405180910390208585838181106110ac576110ac6137c4565b90506020028101906110be91906137f3565b6110cc9060208101906131d0565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f6f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611164576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b04565b61117460408201602083016131d0565b67ffffffffffffffff811660009081526003602052604090208054819061119a90613771565b90506000036111e1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b04565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061121d908690600401613998565b600060405180830381600087803b15801561123757600080fd5b505af1925050508015611248575060015b6112e8573d808015611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b506112886005853561270a565b508335600090815260046020526040902084906112a58282613d72565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112da9084906131bd565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61132261232b565b60005b81811015611315576000838383818110611341576113416137c4565b90506020028101906113539190613e6c565b61135c90613ea0565b905080602001516113c757805167ffffffffffffffff16600090815260036020526040812061138a91612fbe565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26114ae565b806040015151600003611406576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906114329082613f51565b50606082015160018201906114479082613f51565b50816040015160405161145a919061406b565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284606001516040516114a491906131bd565b60405180910390a3505b50600101611325565b6114bf61232b565b73ffffffffffffffffffffffffffffffffffffffff811615806114ea575067ffffffffffffffff8216155b15611521576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526116129161406b565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113159082613f51565b6116c761232b565b73ffffffffffffffffffffffffffffffffffffffff8116611714576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61179361232b565b60075473ffffffffffffffffffffffffffffffffffffffff16156117f4576117f46117d360025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612716565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156118a1576118a161186160025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612898565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461192e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193e60408201602083016131d0565b61194b6040830183613831565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506119a292509050613771565b159050806119f85750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516119e3919061406b565b9081526040519081900360200190205460ff16155b15611a3157806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b0491906131bd565b60085474010000000000000000000000000000000000000000900460ff1661131557611315611a636060850185613831565b810190611a709190613070565b611a7b90600161407d565b6123ac565b611a8b600582612310565b611ac4576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b04565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b0b90613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3790613771565b8015611b845780601f10611b5957610100808354040283529160200191611b84565b820191906000526020600020905b815481529060010190602001808311611b6757829003601f168201915b50505050508152602001600382018054611b9d90613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc990613771565b8015611c165780601f10611beb57610100808354040283529160200191611c16565b820191906000526020600020905b815481529060010190602001808311611bf957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611c995760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c44565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611ceb6002830182612fbe565b611cf9600383016000612fbe565b611d07600483016000612ff8565b50611d1590506005836126fe565b50611d1f8161299c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611d7790613771565b9050600003611dbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b04565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611dee90613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1a90613771565b8015611e675780601f10611e3c57610100808354040283529160200191611e67565b820191906000526020600020905b815481529060010190602001808311611e4a57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ec890613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef490613771565b8015611f415780601f10611f1657610100808354040283529160200191611f41565b820191906000526020600020905b815481529060010190602001808311611f2457829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611fa8908b908690600401614090565b602060405180830381865afa158015611fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe9919061415d565b60075490915073ffffffffffffffffffffffffffffffffffffffff16158015906120a257506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561207c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a0919061415d565b105b156120cc576007546120cc9073ffffffffffffffffffffffffffffffffffffffff16333084612a0e565b60005b875181101561221f5761213f33308a84815181106120ef576120ef6137c4565b6020026020010151602001518b858151811061210d5761210d6137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a0e909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061216f5761216f6137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146122175760025488516122179173ffffffffffffffffffffffffffffffffffffffff16908a90849081106121c8576121c86137c4565b6020026020010151602001518a84815181106121e6576121e66137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127169092919063ffffffff16565b6001016120cf565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612252576000612254565b825b8a856040518463ffffffff1660e01b8152600401612273929190614090565b60206040518083038185885af1158015612291573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122b6919061415d565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516122e991815260200190565b60405180910390a1505050509392505050565b61230461232b565b61230d81612a6c565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b04565b806001166001036123ef576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612423565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161243891815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600754600080855260208501909352909350611315927401000000000000000000000000000000000000000090910467ffffffffffffffff16916124c9565b60408051808201909152600080825260208201528152602001906001900390816124a25790505b5083611d4e565b8047101561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b04565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612594576040519150601f19603f3d011682016040523d82523d6000602084013e612599565b606091505b5050905080611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b04565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113159084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b61565b60006123248383612c6d565b60006123248383612d60565b8015806127b657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b4919061415d565b155b612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b04565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113159084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161267c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561290f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612933919061415d565b61293d919061407d565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129969085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161267c565b50505050565b6129a461232b565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906129e09084906004016132db565b600060405180830381600087803b1580156129fa57600080fd5b505af115801561110a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129969085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161267c565b3373ffffffffffffffffffffffffffffffffffffffff821603612aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b04565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612bc3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612daf9092919063ffffffff16565b8051909150156113155780806020019051810190612be19190614176565b611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b04565b60008181526001830160205260408120548015612d56576000612c91600183614193565b8554909150600090612ca590600190614193565b9050818114612d0a576000866000018281548110612cc557612cc56137c4565b9060005260206000200154905080876000018481548110612ce857612ce86137c4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d1b57612d1b6141a6565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d1565b60009150506105d1565b6000818152600183016020526040812054612da7575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d1565b5060006105d1565b6060612dbe8484600085612dc6565b949350505050565b606082471015612e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b04565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e81919061406b565b60006040518083038185875af1925050503d8060008114612ebe576040519150601f19603f3d011682016040523d82523d6000602084013e612ec3565b606091505b5091509150612ed487838387612edf565b979650505050505050565b60608315612f75578251600003612f6e5773ffffffffffffffffffffffffffffffffffffffff85163b612f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b04565b5081612dbe565b612dbe8383815115612f8a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0491906131bd565b508054612fca90613771565b6000825580601f10612fda575050565b601f01602090049060005260206000209081019061230d9190613019565b508054600082556002029060005260206000209081019061230d9190613032565b5b8082111561302e576000815560010161301a565b5090565b5b8082111561302e5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613033565b60006020828403121561308257600080fd5b5035919050565b67ffffffffffffffff8116811461230d57600080fd5b6000806000604084860312156130b457600080fd5b83356130bf81613089565b9250602084013567ffffffffffffffff808211156130dc57600080fd5b818601915086601f8301126130f057600080fd5b8135818111156130ff57600080fd5b87602082850101111561311157600080fd5b6020830194508093505050509250925092565b801515811461230d57600080fd5b60006020828403121561314457600080fd5b813561232481613124565b60005b8381101561316a578181015183820152602001613152565b50506000910152565b6000815180845261318b81602086016020860161314f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006123246020830184613173565b6000602082840312156131e257600080fd5b813561232481613089565b6040815260006132006040830185613173565b82810360208401526132128185613173565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461230d57600080fd5b60008060006060848603121561325257600080fd5b833561325d8161321b565b9250602084013561326d8161321b565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156132d0578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613293565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261331560c0840182613173565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133518383613173565b925060808601519150808584030160a086015250613212828261327e565b6000806040838503121561338257600080fd5b8235915060208301356133948161321b565b809150509250929050565b60008083601f8401126133b157600080fd5b50813567ffffffffffffffff8111156133c957600080fd5b6020830191508360208260051b85010111156133e457600080fd5b9250929050565b6000806000806040858703121561340157600080fd5b843567ffffffffffffffff8082111561341957600080fd5b6134258883890161339f565b9096509450602087013591508082111561343e57600080fd5b5061344b8782880161339f565b95989497509550505050565b60006020828403121561346957600080fd5b813567ffffffffffffffff81111561348057600080fd5b820160a0818503121561232457600080fd5b600080602083850312156134a557600080fd5b823567ffffffffffffffff8111156134bc57600080fd5b6134c88582860161339f565b90969095509350505050565b600080604083850312156134e757600080fd5b82356134f281613089565b915060208301356133948161321b565b60006020828403121561351457600080fd5b81356123248161321b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156135715761357161351f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135be576135be61351f565b604052919050565b600082601f8301126135d757600080fd5b813567ffffffffffffffff8111156135f1576135f161351f565b61362260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613577565b81815284602083860101111561363757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561366957600080fd5b833561367481613089565b925060208481013567ffffffffffffffff8082111561369257600080fd5b818701915087601f8301126136a657600080fd5b8135818111156136b8576136b861351f565b6136c6848260051b01613577565b81815260069190911b8301840190848101908a8311156136e557600080fd5b938501935b82851015613731576040858c0312156137035760008081fd5b61370b61354e565b85356137168161321b565b815285870135878201528252604090940193908501906136ea565b96505050604087013592508083111561374957600080fd5b5050613757868287016135c6565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061378557607f821691505b6020821081036137be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261382757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261386657600080fd5b83018035915067ffffffffffffffff82111561388157600080fd5b6020019150368190038213156133e457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138cb57600080fd5b830160208101925035905067ffffffffffffffff8111156138eb57600080fd5b8036038213156133e457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156132d05781356139668161321b565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613953565b6020815281356020820152600060208301356139b381613089565b67ffffffffffffffff80821660408501526139d16040860186613896565b925060a060608601526139e860c0860184836138fa565b9250506139f86060860186613896565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a2e8583856138fa565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613a6757600080fd5b60209288019283019235915083821115613a8057600080fd5b8160061b3603831315613a9257600080fd5b8685030160a0870152612ed4848284613943565b601f821115611315576000816000526020600020601f850160051c81016020861015613acf5750805b601f850160051c820191505b81811015613aee57828155600101613adb565b505050505050565b67ffffffffffffffff831115613b0e57613b0e61351f565b613b2283613b1c8354613771565b83613aa6565b6000601f841160018114613b745760008515613b3e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561110a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613bc35786850135825560209485019460019092019101613ba3565b5086821015613bfe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c4a8161321b565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613cb057613cb061351f565b805483825580841015613d3d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613cf157613cf1613c10565b8086168614613d0257613d02613c10565b5060008360005260206000208360011b81018760011b820191505b80821015613d38578282558284830155600282019150613d1d565b505050505b5060008181526020812083915b85811015613aee57613d5c8383613c3f565b6040929092019160029190910190600101613d4a565b81358155600181016020830135613d8881613089565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613dc86040860186613831565b93509150613dda838360028701613af6565b613de76060860186613831565b93509150613df9838360038701613af6565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e3057600080fd5b918401918235915080821115613e4557600080fd5b506020820191508060061b3603821315613e5e57600080fd5b612996818360048601613c97565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261382757600080fd5b600060808236031215613eb257600080fd5b6040516080810167ffffffffffffffff8282108183111715613ed657613ed661351f565b8160405284359150613ee782613089565b908252602084013590613ef982613124565b8160208401526040850135915080821115613f1357600080fd5b613f1f368387016135c6565b60408401526060850135915080821115613f3857600080fd5b50613f45368286016135c6565b60608301525092915050565b815167ffffffffffffffff811115613f6b57613f6b61351f565b613f7f81613f798454613771565b84613aa6565b602080601f831160018114613fd25760008415613f9c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613aee565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561401f57888601518255948401946001909101908401614000565b508582101561405b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161382781846020870161314f565b808201808211156105d1576105d1613c10565b67ffffffffffffffff83168152604060208201526000825160a060408401526140bc60e0840182613173565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526140f88383613173565b92506040860151915080858403016080860152614115838361327e565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506141538282613173565b9695505050505050565b60006020828403121561416f57600080fd5b5051919050565b60006020828403121561418857600080fd5b815161232481613124565b818103818111156105d1576105d1613c10565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -262,28 +262,6 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetMessageContents(messageId [32 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) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _PingPongDemo.Contract.GetMessageStatus(&_PingPongDemo.CallOpts, messageId) -} - -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) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "getRouter") @@ -328,6 +306,28 @@ func (_PingPongDemo *PingPongDemoCallerSession) IsApprovedSender(sourceChainSele return _PingPongDemo.Contract.IsApprovedSender(&_PingPongDemo.CallOpts, sourceChainSelector, senderAddr) } +func (_PingPongDemo *PingPongDemoCaller) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "isFailedMessage", messageId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _PingPongDemo.Contract.IsFailedMessage(&_PingPongDemo.CallOpts, messageId) +} + +func (_PingPongDemo *PingPongDemoCallerSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _PingPongDemo.Contract.IsFailedMessage(&_PingPongDemo.CallOpts, messageId) +} + func (_PingPongDemo *PingPongDemoCaller) IsPaused(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "isPaused") @@ -542,30 +542,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpart(counterpartCh return _PingPongDemo.Contract.SetCounterpart(&_PingPongDemo.TransactOpts, counterpartChainSelector, counterpartAddress) } -func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "setCounterpartAddress", counterpartAddress) -} - -func (_PingPongDemo *PingPongDemoSession) SetCounterpartAddress(counterpartAddress common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, counterpartAddress) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartAddress(counterpartAddress common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, counterpartAddress) -} - -func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "setCounterpartChainSelector", counterpartChainSelector) -} - -func (_PingPongDemo *PingPongDemoSession) SetCounterpartChainSelector(counterpartChainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, counterpartChainSelector) -} - -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) { return _PingPongDemo.contract.Transact(opts, "setPaused", pause) } @@ -638,18 +614,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) UpdateRouter(newRouter commo return _PingPongDemo.Contract.UpdateRouter(&_PingPongDemo.TransactOpts, newRouter) } -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) } @@ -2854,12 +2818,12 @@ type PingPongDemoInterface 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) + IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) + IsPaused(opts *bind.CallOpts) (bool, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -2888,10 +2852,6 @@ type PingPongDemoInterface interface { SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) - - SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) - SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) @@ -2904,8 +2864,6 @@ type PingPongDemoInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(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 3ec95d7c8f..14d2a45c43 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162005078380380620050788339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556008805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600960156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b61493480620007446000396000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e89b448511610064578063e89b44851461066e578063ef686d8e14610681578063f2fde38b146106a1578063ff2deec3146106c157600080fd5b8063c89245d5146105d0578063cf6730f8146105f0578063e4ca875414610610578063e6c725f51461063057600080fd5b8063b187bd26116100d1578063b187bd2614610515578063b5a1101114610545578063bee518a414610565578063c851cc32146105b057600080fd5b80638f491cba1461048a5780639d2aede5146104aa5780639fe74e26146104ca578063b0f479a1146104ea57600080fd5b8063536c6bfa1161017a57806379ba50971161014957806379ba50971461040a5780638462a2b91461041f57806385572ffb1461043f5780638da5cb5b1461045f57600080fd5b8063536c6bfa1461037d5780635e35359e1461039d5780636939cd97146103bd5780636d62d633146103ea57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635075a9d41461034f57600080fd5b80630e958d6b146101f357806316c38b3c14610228578063181f5a771461024a5780631892b906146102a057600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613810565b6106ee565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b506102486102433660046138a3565b610739565b005b34801561025657600080fd5b506102936040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e322e30000000000000000081525081565b60405161021f919061392e565b3480156102ac57600080fd5b506102486102bb366004613941565b61078b565b3480156102cc57600080fd5b506102486107e6565b3480156102e157600080fd5b5060095473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c366004613941565b610822565b60405161021f92919061395e565b34801561035b57600080fd5b5061036f61036a36600461398c565b61094e565b60405190815260200161021f565b34801561038957600080fd5b506102486103983660046139c7565b610961565b3480156103a957600080fd5b506102486103b83660046139f3565b6109c5565b3480156103c957600080fd5b506103dd6103d836600461398c565b610a5a565b60405161021f9190613a91565b3480156103f657600080fd5b50610248610405366004613b25565b610c65565b34801561041657600080fd5b50610248610f7f565b34801561042b57600080fd5b5061024861043a366004613ba1565b61107c565b34801561044b57600080fd5b5061024861045a366004613c0d565b6113bd565b34801561046b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049657600080fd5b506102486104a536600461398c565b6115c6565b3480156104b657600080fd5b506102486104c5366004613c48565b6117a1565b3480156104d657600080fd5b506102486104e5366004613c65565b611866565b3480156104f657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561052157600080fd5b5060095474010000000000000000000000000000000000000000900460ff16610213565b34801561055157600080fd5b50610248610560366004613ca7565b611bf7565b34801561057157600080fd5b5060085474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105bc57600080fd5b506102486105cb366004613c48565b611d9d565b3480156105dc57600080fd5b506102486105eb366004613c48565b611e69565b3480156105fc57600080fd5b5061024861060b366004613c0d565b611fd3565b34801561061c57600080fd5b5061024861062b36600461398c565b612169565b34801561063c57600080fd5b506009547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b61036f61067c366004613e0a565b6123d3565b34801561068d57600080fd5b5061024861069c366004613f17565b612981565b3480156106ad57600080fd5b506102486106bc366004613c48565b612a0a565b3480156106cd57600080fd5b506008546102fc9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061071d9085908590613f3a565b9081526040519081900360200190205460ff1690509392505050565b610741612a1b565b6009805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610793612a1b565b6008805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107ee612a1b565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556108206001612a9c565b565b60036020526000908152604090208054819061083d90613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613f4a565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050908060010180546108cb90613f4a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790613f4a565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905082565b600061095b600583612cd8565b92915050565b610969612a1b565b6109738282612ceb565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6109cd612a1b565b6109ee73ffffffffffffffffffffffffffffffffffffffff84168383612e45565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e83604051610a4d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610ac990613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610af590613f4a565b8015610b425780601f10610b1757610100808354040283529160200191610b42565b820191906000526020600020905b815481529060010190602001808311610b2557829003601f168201915b50505050508152602001600382018054610b5b90613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790613f4a565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610c575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c02565b505050915250909392505050565b610c6d612a1b565b6001610c7a600584612cd8565b14610cb9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b610cc98260025b60059190612f19565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610d1190613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90613f4a565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b50505050508152602001600382018054610da390613f4a565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcf90613f4a565b8015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e9f5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e4a565b5050505081525050905060005b816080015151811015610f2e57610f268383608001518381518110610ed357610ed3613f9d565b60200260200101516020015184608001518481518110610ef557610ef5613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e459092919063ffffffff16565b600101610eac565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610cb0565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611084612a1b565b60005b8181101561121757600360008484848181106110a5576110a5613f9d565b90506020028101906110b79190613fcc565b6110c5906020810190613941565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018383838181106110fc576110fc613f9d565b905060200281019061110e9190613fcc565b61111c90602081019061400a565b60405161112a929190613f3a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905582828281811061117157611171613f9d565b90506020028101906111839190613fcc565b61119190602081019061400a565b60405161119f929190613f3a565b60405180910390208383838181106111b9576111b9613f9d565b90506020028101906111cb9190613fcc565b6111d9906020810190613941565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611087565b5060005b838110156113b65760016003600087878581811061123b5761123b613f9d565b905060200281019061124d9190613fcc565b61125b906020810190613941565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061129257611292613f9d565b90506020028101906112a49190613fcc565b6112b290602081019061400a565b6040516112c0929190613f3a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061131057611310613f9d565b90506020028101906113229190613fcc565b61133090602081019061400a565b60405161133e929190613f3a565b604051809103902085858381811061135857611358613f9d565b905060200281019061136a9190613fcc565b611378906020810190613941565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161121b565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611410576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610cb0565b6114206040820160208301613941565b67ffffffffffffffff811660009081526003602052604090208054819061144690613f4a565b905060000361148d576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906114c9908690600401614171565b600060405180830381600087803b1580156114e357600080fd5b505af19250505080156114f4575060015b611594573d808015611522576040519150601f19603f3d011682016040523d82523d6000602084013e611527565b606091505b5061153484356001610cc0565b50833560009081526004602052604090208490611551828261454b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061158690849061392e565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6009547501000000000000000000000000000000000000000000900460ff16158061160e57506009547501000000000000000000000000000000000000000000900460ff1681105b156116165750565b600954600190611642907501000000000000000000000000000000000000000000900460ff1683614645565b1161179e5760025473ffffffffffffffffffffffffffffffffffffffff166008546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117159190614680565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175c57600080fd5b505af1158015611770573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6117a9612a1b565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560408051602081019290925201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815260085474010000000000000000000000000000000000000000900467ffffffffffffffff16600090815260036020522090611862908261469d565b5050565b61186e612a1b565b60005b818110156115c15782828281811061188b5761188b613f9d565b905060200281019061189d91906147b7565b6118ae9060408101906020016138a3565b61197a57600360008484848181106118c8576118c8613f9d565b90506020028101906118da91906147b7565b6118e8906020810190613941565b67ffffffffffffffff1681526020810191909152604001600090812061190d916137ac565b82828281811061191f5761191f613f9d565b905060200281019061193191906147b7565b61193f906020810190613941565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611bef565b82828281811061198c5761198c613f9d565b905060200281019061199e91906147b7565b6119ac90604081019061400a565b90506000036119e7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600360008585858181106119ff576119ff613f9d565b9050602002810190611a1191906147b7565b611a1f906020810190613941565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000209050838383818110611a5557611a55613f9d565b9050602002810190611a6791906147b7565b611a7590604081019061400a565b8291611a829190836142cf565b50838383818110611a9557611a95613f9d565b9050602002810190611aa791906147b7565b611ab590606081019061400a565b159050611b0057838383818110611ace57611ace613f9d565b9050602002810190611ae091906147b7565b611aee90606081019061400a565b6001830191611afe9190836142cf565b505b838383818110611b1257611b12613f9d565b9050602002810190611b2491906147b7565b611b3290604081019061400a565b604051611b40929190613f3a565b6040518091039020848484818110611b5a57611b5a613f9d565b9050602002810190611b6c91906147b7565b611b7a906020810190613941565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212868686818110611bb757611bb7613f9d565b9050602002810190611bc991906147b7565b611bd790606081019061400a565b604051611be59291906147eb565b60405180910390a3505b600101611871565b611bff612a1b565b600880547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611cf0916147ff565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906115c1908261469d565b611da5612a1b565b73ffffffffffffffffffffffffffffffffffffffff8116611df2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611e71612a1b565b60085473ffffffffffffffffffffffffffffffffffffffff1615611ed257611ed2611eb160025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16906000612f2e565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611f7f57611f7f611f3f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6130b0565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461200c576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61201c6040820160208301613941565b612029604083018361400a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061208092509050613f4a565b159050806120d65750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516120c191906147ff565b9081526040519081900360200190205460ff16155b1561210f57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610cb0919061392e565b600061211e606085018561400a565b81019061212b919061398c565b60095490915074010000000000000000000000000000000000000000900460ff166121635761216361215e826001614811565b612a9c565b50505050565b6001612176600583612cd8565b146121b0576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610cb0565b6121bb816000610cc0565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161220390613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461222f90613f4a565b801561227c5780601f106122515761010080835404028352916020019161227c565b820191906000526020600020905b81548152906001019060200180831161225f57829003601f168201915b5050505050815260200160038201805461229590613f4a565b80601f01602080910402602001604051908101604052809291908181526020018280546122c190613f4a565b801561230e5780601f106122e35761010080835404028352916020019161230e565b820191906000526020600020905b8154815290600101906020018083116122f157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156123915760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161233c565b505050508152505090506123a4816131ae565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906123fc90613f4a565b9050600003612443576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610cb0565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061247390613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461249f90613f4a565b80156124ec5780601f106124c1576101008083540402835291602001916124ec565b820191906000526020600020905b8154815290600101906020018083116124cf57829003601f168201915b5050509183525050602080820188905260408083018a905260085473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161254d90613f4a565b80601f016020809104026020016040519081016040528092919081815260200182805461257990613f4a565b80156125c65780601f1061259b576101008083540402835291602001916125c6565b820191906000526020600020905b8154815290600101906020018083116125a957829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded9061262d908b908690600401614824565b602060405180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e91906148f1565b60085490915073ffffffffffffffffffffffffffffffffffffffff161580159061272757506008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612701573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272591906148f1565b105b15612751576008546127519073ffffffffffffffffffffffffffffffffffffffff16333084613220565b60005b87518110156128a4576127c433308a848151811061277457612774613f9d565b6020026020010151602001518b858151811061279257612792613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16613220909392919063ffffffff16565b600854885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106127f4576127f4613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461289c57600254885161289c9173ffffffffffffffffffffffffffffffffffffffff16908a908490811061284d5761284d613f9d565b6020026020010151602001518a848151811061286b5761286b613f9d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612f2e9092919063ffffffff16565b600101612754565b5060025460085473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156128d75760006128d9565b825b8a856040518463ffffffff1660e01b81526004016128f8929190614824565b60206040518083038185885af1158015612916573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061293b91906148f1565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161296e91815260200190565b60405180910390a1505050509392505050565b612989612a1b565b600980547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612a12612a1b565b61179e8161327e565b60005473ffffffffffffffffffffffffffffffffffffffff163314610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610cb0565b80600116600103612adf576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612b13565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612b1c816115c6565b6040805160a0810190915260095473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612b7491815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612bee57816020015b6040805180820190915260008082526020820152815260200190600190039081612bc75790505b50815260085473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612c4560025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600860149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612c95929190614824565b6020604051808303816000875af1158015612cb4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906148f1565b6000612ce48383613373565b9392505050565b80471015612d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cb0565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b50509050806115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526133fd565b6000612f26848484613509565b949350505050565b801580612fce57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcc91906148f1565b155b61305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610cb0565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115c19084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612e97565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015613127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314b91906148f1565b6131559190614811565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506121639085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612e97565b6131b6612a1b565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906131f2908490600401613a91565b600060405180830381600087803b15801561320c57600080fd5b505af11580156113b6573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526121639085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612e97565b3373ffffffffffffffffffffffffffffffffffffffff8216036132fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610cb0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526002830160205260408120548015158061339757506133978484613526565b612ce4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610cb0565b600061345f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135329092919063ffffffff16565b8051909150156115c1578080602001905181019061347d919061490a565b6115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610cb0565b60008281526002840160205260408120829055612f268484613541565b6000612ce4838361354d565b6060612f268484600085613565565b6000612ce4838361367e565b60008181526001830160205260408120541515612ce4565b6060824710156135f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610cb0565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161362091906147ff565b60006040518083038185875af1925050503d806000811461365d576040519150601f19603f3d011682016040523d82523d6000602084013e613662565b606091505b5091509150613673878383876136cd565b979650505050505050565b60008181526001830160205260408120546136c55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561095b565b50600061095b565b6060831561376357825160000361375c5773ffffffffffffffffffffffffffffffffffffffff85163b61375c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cb0565b5081612f26565b612f2683838151156137785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb0919061392e565b5080546137b890613f4a565b6000825580601f106137c8575050565b601f01602090049060005260206000209081019061179e91905b808211156137f657600081556001016137e2565b5090565b67ffffffffffffffff8116811461179e57600080fd5b60008060006040848603121561382557600080fd5b8335613830816137fa565b9250602084013567ffffffffffffffff8082111561384d57600080fd5b818601915086601f83011261386157600080fd5b81358181111561387057600080fd5b87602082850101111561388257600080fd5b6020830194508093505050509250925092565b801515811461179e57600080fd5b6000602082840312156138b557600080fd5b8135612ce481613895565b60005b838110156138db5781810151838201526020016138c3565b50506000910152565b600081518084526138fc8160208601602086016138c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612ce460208301846138e4565b60006020828403121561395357600080fd5b8135612ce4816137fa565b60408152600061397160408301856138e4565b828103602084015261398381856138e4565b95945050505050565b60006020828403121561399e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179e57600080fd5b600080604083850312156139da57600080fd5b82356139e5816139a5565b946020939093013593505050565b600080600060608486031215613a0857600080fd5b8335613a13816139a5565b92506020840135613a23816139a5565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613a86578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613a49565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613acb60c08401826138e4565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613b0783836138e4565b925060808601519150808584030160a0860152506139838282613a34565b60008060408385031215613b3857600080fd5b823591506020830135613b4a816139a5565b809150509250929050565b60008083601f840112613b6757600080fd5b50813567ffffffffffffffff811115613b7f57600080fd5b6020830191508360208260051b8501011115613b9a57600080fd5b9250929050565b60008060008060408587031215613bb757600080fd5b843567ffffffffffffffff80821115613bcf57600080fd5b613bdb88838901613b55565b90965094506020870135915080821115613bf457600080fd5b50613c0187828801613b55565b95989497509550505050565b600060208284031215613c1f57600080fd5b813567ffffffffffffffff811115613c3657600080fd5b820160a08185031215612ce457600080fd5b600060208284031215613c5a57600080fd5b8135612ce4816139a5565b60008060208385031215613c7857600080fd5b823567ffffffffffffffff811115613c8f57600080fd5b613c9b85828601613b55565b90969095509350505050565b60008060408385031215613cba57600080fd5b8235613cc5816137fa565b91506020830135613b4a816139a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613d2757613d27613cd5565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d7457613d74613cd5565b604052919050565b600082601f830112613d8d57600080fd5b813567ffffffffffffffff811115613da757613da7613cd5565b613dd860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613d2d565b818152846020838601011115613ded57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613e1f57600080fd5b8335613e2a816137fa565b925060208481013567ffffffffffffffff80821115613e4857600080fd5b818701915087601f830112613e5c57600080fd5b813581811115613e6e57613e6e613cd5565b613e7c848260051b01613d2d565b81815260069190911b8301840190848101908a831115613e9b57600080fd5b938501935b82851015613ee7576040858c031215613eb95760008081fd5b613ec1613d04565b8535613ecc816139a5565b81528587013587820152825260409094019390850190613ea0565b965050506040870135925080831115613eff57600080fd5b5050613f0d86828701613d7c565b9150509250925092565b600060208284031215613f2957600080fd5b813560ff81168114612ce457600080fd5b8183823760009101908152919050565b600181811c90821680613f5e57607f821691505b602082108103613f97577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261400057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261403f57600080fd5b83018035915067ffffffffffffffff82111561405a57600080fd5b602001915036819003821315613b9a57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140a457600080fd5b830160208101925035905067ffffffffffffffff8111156140c457600080fd5b803603821315613b9a57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613a8657813561413f816139a5565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161412c565b60208152813560208201526000602083013561418c816137fa565b67ffffffffffffffff80821660408501526141aa604086018661406f565b925060a060608601526141c160c0860184836140d3565b9250506141d1606086018661406f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526142078583856140d3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261424057600080fd5b6020928801928301923591508382111561425957600080fd5b8160061b360383131561426b57600080fd5b8685030160a087015261367384828461411c565b601f8211156115c1576000816000526020600020601f850160051c810160208610156142a85750805b601f850160051c820191505b818110156142c7578281556001016142b4565b505050505050565b67ffffffffffffffff8311156142e7576142e7613cd5565b6142fb836142f58354613f4a565b8361427f565b6000601f84116001811461434d57600085156143175750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556113b6565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561439c578685013582556020948501946001909201910161437c565b50868210156143d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135614423816139a5565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561448957614489613cd5565b8054838255808410156145165760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146144ca576144ca6143e9565b80861686146144db576144db6143e9565b5060008360005260206000208360011b81018760011b820191505b808210156145115782825582848301556002820191506144f6565b505050505b5060008181526020812083915b858110156142c7576145358383614418565b6040929092019160029190910190600101614523565b81358155600181016020830135614561816137fa565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556145a1604086018661400a565b935091506145b38383600287016142cf565b6145c0606086018661400a565b935091506145d28383600387016142cf565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261460957600080fd5b91840191823591508082111561461e57600080fd5b506020820191508060061b360382131561463757600080fd5b612163818360048601614470565b60008261467b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561469257600080fd5b8151612ce4816139a5565b815167ffffffffffffffff8111156146b7576146b7613cd5565b6146cb816146c58454613f4a565b8461427f565b602080601f83116001811461471e57600084156146e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556142c7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561476b5788860151825594840194600190910190840161474c565b50858210156147a757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261400057600080fd5b602081526000612f266020830184866140d3565b600082516140008184602087016138c0565b8082018082111561095b5761095b6143e9565b67ffffffffffffffff83168152604060208201526000825160a0604084015261485060e08401826138e4565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261488c83836138e4565b925060408601519150808584030160808601526148a98383613a34565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506148e782826138e4565b9695505050505050565b60006020828403121561490357600080fd5b5051919050565b60006020828403121561491c57600080fd5b8151612ce48161389556fea164736f6c6343000818000a", + 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004dc338038062004dc38339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556007805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600860156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b61467f80620007446000396000f3fe6080604052600436106101c65760003560e01c80638f491cba116100f7578063c89245d511610095578063e89b448511610064578063e89b4485146105df578063ef686d8e14610600578063f2fde38b14610620578063ff2deec31461064057600080fd5b8063c89245d514610541578063cf6730f814610561578063e4ca875414610581578063e6c725f5146105a157600080fd5b8063b187bd26116100d1578063b187bd2614610486578063b5a11011146104b6578063bee518a4146104d6578063c851cc321461052157600080fd5b80638f491cba1461041b5780639fe74e261461043b578063b0f479a11461045b57600080fd5b80635e35359e1161016457806379ba50971161013e57806379ba50971461039b5780638462a2b9146103b057806385572ffb146103d05780638da5cb5b146103f057600080fd5b80635e35359e1461032e5780636939cd971461034e5780636d62d6331461037b57600080fd5b8063181f5a77116101a0578063181f5a77146102495780632874d8bf1461029f5780632b6e5d63146102b457806335f170ef1461030057600080fd5b80630a9094dc146101d25780630e958d6b1461020757806316c38b3c1461022757600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004613492565b61066d565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506101f26102223660046134c1565b610680565b34801561023357600080fd5b50610247610242366004613554565b6106cb565b005b34801561025557600080fd5b506102926040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b6040516101fe91906135df565b3480156102ab57600080fd5b5061024761071d565b3480156102c057600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030c57600080fd5b5061032061031b3660046135f2565b610759565b6040516101fe92919061360f565b34801561033a57600080fd5b5061024761034936600461365f565b610885565b34801561035a57600080fd5b5061036e610369366004613492565b61095a565b6040516101fe91906136fd565b34801561038757600080fd5b50610247610396366004613791565b610b65565b3480156103a757600080fd5b50610247610d7c565b3480156103bc57600080fd5b506102476103cb36600461380d565b610e79565b3480156103dc57600080fd5b506102476103eb366004613879565b6111ba565b3480156103fc57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102db565b34801561042757600080fd5b50610247610436366004613492565b6113c3565b34801561044757600080fd5b506102476104563660046138b4565b61159e565b34801561046757600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102db565b34801561049257600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101f2565b3480156104c257600080fd5b506102476104d13660046138f6565b61173b565b3480156104e257600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561052d57600080fd5b5061024761053c366004613924565b611943565b34801561054d57600080fd5b5061024761055c366004613924565b611a0f565b34801561056d57600080fd5b5061024761057c366004613879565b611b79565b34801561058d57600080fd5b5061024761059c366004613492565b611d04565b3480156105ad57600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff90911681526020016101fe565b6105f26105ed366004613a76565b611fd2565b6040519081526020016101fe565b34801561060c57600080fd5b5061024761061b366004613b83565b612580565b34801561062c57600080fd5b5061024761063b366004613924565b612609565b34801561064c57600080fd5b506007546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b600061067a60058361261a565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106af9085908590613ba6565b9081526040519081900360200190205460ff1690509392505050565b6106d3612635565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610725612635565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905561075760016126b6565b565b60036020526000908152604090208054819061077490613bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090613bb6565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b50505050509080600101805461080290613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461082e90613bb6565b801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b5050505050905082565b61088d612635565b73ffffffffffffffffffffffffffffffffffffffff83166108cd576108c873ffffffffffffffffffffffffffffffffffffffff8316826128f2565b6108ee565b6108ee73ffffffffffffffffffffffffffffffffffffffff84168383612a4c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161094d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109c990613bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590613bb6565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b50505050508152602001600382018054610a5b90613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8790613bb6565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b02565b505050915250909392505050565b610b6d612635565b610b7860058361261a565b610bb6576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610c375760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610be2565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c8760028301826133e0565b610c956003830160006133e0565b610ca360048301600061341a565b50610cb19050600584612b20565b5060005b8151811015610d2b57610d2383838381518110610cd457610cd4613c09565b602002602001015160200151848481518110610cf257610cf2613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a4c9092919063ffffffff16565b600101610cb5565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bad565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e81612635565b60005b818110156110145760036000848484818110610ea257610ea2613c09565b9050602002810190610eb49190613c38565b610ec29060208101906135f2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610ef957610ef9613c09565b9050602002810190610f0b9190613c38565b610f19906020810190613c76565b604051610f27929190613ba6565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f6e57610f6e613c09565b9050602002810190610f809190613c38565b610f8e906020810190613c76565b604051610f9c929190613ba6565b6040518091039020838383818110610fb657610fb6613c09565b9050602002810190610fc89190613c38565b610fd69060208101906135f2565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e84565b5060005b838110156111b35760016003600087878581811061103857611038613c09565b905060200281019061104a9190613c38565b6110589060208101906135f2565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061108f5761108f613c09565b90506020028101906110a19190613c38565b6110af906020810190613c76565b6040516110bd929190613ba6565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061110d5761110d613c09565b905060200281019061111f9190613c38565b61112d906020810190613c76565b60405161113b929190613ba6565b604051809103902085858381811061115557611155613c09565b90506020028101906111679190613c38565b6111759060208101906135f2565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611018565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461120d576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bad565b61121d60408201602083016135f2565b67ffffffffffffffff811660009081526003602052604090208054819061124390613bb6565b905060000361128a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bad565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112c6908690600401613ddd565b600060405180830381600087803b1580156112e057600080fd5b505af19250505080156112f1575060015b611391573d80801561131f576040519150601f19603f3d011682016040523d82523d6000602084013e611324565b606091505b5061133160058535612b2c565b5083356000908152600460205260409020849061134e82826141b7565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113839084906135df565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6008547501000000000000000000000000000000000000000000900460ff16158061140b57506008547501000000000000000000000000000000000000000000900460ff1681105b156114135750565b60085460019061143f907501000000000000000000000000000000000000000000900460ff16836142b1565b1161159b5760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151291906142ec565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561155957600080fd5b505af115801561156d573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6115a6612635565b60005b818110156113be5760008383838181106115c5576115c5613c09565b90506020028101906115d79190614309565b6115e09061433d565b9050806020015161164b57805167ffffffffffffffff16600090815260036020526040812061160e916133e0565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611732565b80604001515160000361168a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906116b690826143ee565b50606082015160018201906116cb90826143ee565b5081604001516040516116de9190614508565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212846060015160405161172891906135df565b60405180910390a3505b506001016115a9565b611743612635565b73ffffffffffffffffffffffffffffffffffffffff8116158061176e575067ffffffffffffffff8216155b156117a5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261189691614508565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113be90826143ee565b61194b612635565b73ffffffffffffffffffffffffffffffffffffffff8116611998576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611a17612635565b60075473ffffffffffffffffffffffffffffffffffffffff1615611a7857611a78611a5760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612b38565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611b2557611b25611ae560025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612cba565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611bb2576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bc260408201602083016135f2565b611bcf6040830183613c76565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611c2692509050613bb6565b15905080611c7c5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611c679190614508565b9081526040519081900360200190205460ff16155b15611cb557806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bad91906135df565b60085474010000000000000000000000000000000000000000900460ff166113be576113be611ce76060850185613c76565b810190611cf49190613492565b611cff90600161451a565b6126b6565b611d0f60058261261a565b611d48576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610bad565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611d8f90613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb90613bb6565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b50505050508152602001600382018054611e2190613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4d90613bb6565b8015611e9a5780601f10611e6f57610100808354040283529160200191611e9a565b820191906000526020600020905b815481529060010190602001808311611e7d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611f1d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611ec8565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611f6f60028301826133e0565b611f7d6003830160006133e0565b611f8b60048301600061341a565b50611f999050600583612b20565b50611fa381612dbe565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ffb90613bb6565b9050600003612042576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bad565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061207290613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461209e90613bb6565b80156120eb5780601f106120c0576101008083540402835291602001916120eb565b820191906000526020600020905b8154815290600101906020018083116120ce57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161214c90613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461217890613bb6565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded9061222c908b90869060040161452d565b602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d91906145fa565b60075490915073ffffffffffffffffffffffffffffffffffffffff161580159061232657506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612300573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232491906145fa565b105b15612350576007546123509073ffffffffffffffffffffffffffffffffffffffff16333084612e30565b60005b87518110156124a3576123c333308a848151811061237357612373613c09565b6020026020010151602001518b858151811061239157612391613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e30909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106123f3576123f3613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461249b57600254885161249b9173ffffffffffffffffffffffffffffffffffffffff16908a908490811061244c5761244c613c09565b6020026020010151602001518a848151811061246a5761246a613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b389092919063ffffffff16565b600101612353565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156124d65760006124d8565b825b8a856040518463ffffffff1660e01b81526004016124f792919061452d565b60206040518083038185885af1158015612515573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061253a91906145fa565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161256d91815260200190565b60405180910390a1505050509392505050565b612588612635565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612611612635565b61159b81612e8e565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bad565b806001166001036126f9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a161272d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612736816113c3565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161278e91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561280857816020015b60408051808201909152600080825260208201528152602001906001900390816127e15790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061285f60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b81526004016128af92919061452d565b6020604051808303816000875af11580156128ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113be91906145fa565b8047101561295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bad565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b50509050806113be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bad565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113be9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f83565b600061262e838361308f565b600061262e8383613182565b801580612bd857506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd691906145fa565b155b612c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bad565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113be9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a9e565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5591906145fa565b612d5f919061451a565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612db89085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a9e565b50505050565b612dc6612635565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e029084906004016136fd565b600060405180830381600087803b158015612e1c57600080fd5b505af11580156111b3573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612db89085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a9e565b3373ffffffffffffffffffffffffffffffffffffffff821603612f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bad565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612fe5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131d19092919063ffffffff16565b8051909150156113be57808060200190518101906130039190614613565b6113be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bad565b600081815260018301602052604081205480156131785760006130b3600183614630565b85549091506000906130c790600190614630565b905081811461312c5760008660000182815481106130e7576130e7613c09565b906000526020600020015490508087600001848154811061310a5761310a613c09565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061313d5761313d614643565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067a565b600091505061067a565b60008181526001830160205260408120546131c95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067a565b50600061067a565b60606131e084846000856131e8565b949350505050565b60608247101561327a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bad565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132a39190614508565b60006040518083038185875af1925050503d80600081146132e0576040519150601f19603f3d011682016040523d82523d6000602084013e6132e5565b606091505b50915091506132f687838387613301565b979650505050505050565b606083156133975782516000036133905773ffffffffffffffffffffffffffffffffffffffff85163b613390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bad565b50816131e0565b6131e083838151156133ac5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad91906135df565b5080546133ec90613bb6565b6000825580601f106133fc575050565b601f01602090049060005260206000209081019061159b919061343b565b508054600082556002029060005260206000209081019061159b9190613454565b5b80821115613450576000815560010161343c565b5090565b5b808211156134505780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613455565b6000602082840312156134a457600080fd5b5035919050565b67ffffffffffffffff8116811461159b57600080fd5b6000806000604084860312156134d657600080fd5b83356134e1816134ab565b9250602084013567ffffffffffffffff808211156134fe57600080fd5b818601915086601f83011261351257600080fd5b81358181111561352157600080fd5b87602082850101111561353357600080fd5b6020830194508093505050509250925092565b801515811461159b57600080fd5b60006020828403121561356657600080fd5b813561262e81613546565b60005b8381101561358c578181015183820152602001613574565b50506000910152565b600081518084526135ad816020860160208601613571565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061262e6020830184613595565b60006020828403121561360457600080fd5b813561262e816134ab565b6040815260006136226040830185613595565b82810360208401526136348185613595565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159b57600080fd5b60008060006060848603121561367457600080fd5b833561367f8161363d565b9250602084013561368f8161363d565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261373760c0840182613595565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137738383613595565b925060808601519150808584030160a08601525061363482826136a0565b600080604083850312156137a457600080fd5b8235915060208301356137b68161363d565b809150509250929050565b60008083601f8401126137d357600080fd5b50813567ffffffffffffffff8111156137eb57600080fd5b6020830191508360208260051b850101111561380657600080fd5b9250929050565b6000806000806040858703121561382357600080fd5b843567ffffffffffffffff8082111561383b57600080fd5b613847888389016137c1565b9096509450602087013591508082111561386057600080fd5b5061386d878288016137c1565b95989497509550505050565b60006020828403121561388b57600080fd5b813567ffffffffffffffff8111156138a257600080fd5b820160a0818503121561262e57600080fd5b600080602083850312156138c757600080fd5b823567ffffffffffffffff8111156138de57600080fd5b6138ea858286016137c1565b90969095509350505050565b6000806040838503121561390957600080fd5b8235613914816134ab565b915060208301356137b68161363d565b60006020828403121561393657600080fd5b813561262e8161363d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561399357613993613941565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e0576139e0613941565b604052919050565b600082601f8301126139f957600080fd5b813567ffffffffffffffff811115613a1357613a13613941565b613a4460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613999565b818152846020838601011115613a5957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8b57600080fd5b8335613a96816134ab565b925060208481013567ffffffffffffffff80821115613ab457600080fd5b818701915087601f830112613ac857600080fd5b813581811115613ada57613ada613941565b613ae8848260051b01613999565b81815260069190911b8301840190848101908a831115613b0757600080fd5b938501935b82851015613b53576040858c031215613b255760008081fd5b613b2d613970565b8535613b388161363d565b81528587013587820152825260409094019390850190613b0c565b965050506040870135925080831115613b6b57600080fd5b5050613b79868287016139e8565b9150509250925092565b600060208284031215613b9557600080fd5b813560ff8116811461262e57600080fd5b8183823760009101908152919050565b600181811c90821680613bca57607f821691505b602082108103613c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c6c57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cab57600080fd5b83018035915067ffffffffffffffff821115613cc657600080fd5b60200191503681900382131561380657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d1057600080fd5b830160208101925035905067ffffffffffffffff811115613d3057600080fd5b80360382131561380657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136f2578135613dab8161363d565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d98565b602081528135602082015260006020830135613df8816134ab565b67ffffffffffffffff8082166040850152613e166040860186613cdb565b925060a06060860152613e2d60c086018483613d3f565b925050613e3d6060860186613cdb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e73858385613d3f565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613eac57600080fd5b60209288019283019235915083821115613ec557600080fd5b8160061b3603831315613ed757600080fd5b8685030160a08701526132f6848284613d88565b601f8211156113be576000816000526020600020601f850160051c81016020861015613f145750805b601f850160051c820191505b81811015613f3357828155600101613f20565b505050505050565b67ffffffffffffffff831115613f5357613f53613941565b613f6783613f618354613bb6565b83613eeb565b6000601f841160018114613fb95760008515613f835750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556111b3565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140085786850135825560209485019460019092019101613fe8565b5086821015614043577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561408f8161363d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140f5576140f5613941565b8054838255808410156141825760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461413657614136614055565b808616861461414757614147614055565b5060008360005260206000208360011b81018760011b820191505b8082101561417d578282558284830155600282019150614162565b505050505b5060008181526020812083915b85811015613f33576141a18383614084565b604092909201916002919091019060010161418f565b813581556001810160208301356141cd816134ab565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561420d6040860186613c76565b9350915061421f838360028701613f3b565b61422c6060860186613c76565b9350915061423e838360038701613f3b565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261427557600080fd5b91840191823591508082111561428a57600080fd5b506020820191508060061b36038213156142a357600080fd5b612db88183600486016140dc565b6000826142e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142fe57600080fd5b815161262e8161363d565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c6c57600080fd5b60006080823603121561434f57600080fd5b6040516080810167ffffffffffffffff828210818311171561437357614373613941565b8160405284359150614384826134ab565b90825260208401359061439682613546565b81602084015260408501359150808211156143b057600080fd5b6143bc368387016139e8565b604084015260608501359150808211156143d557600080fd5b506143e2368286016139e8565b60608301525092915050565b815167ffffffffffffffff81111561440857614408613941565b61441c816144168454613bb6565b84613eeb565b602080601f83116001811461446f57600084156144395750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f33565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144bc5788860151825594840194600190910190840161449d565b50858210156144f857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613c6c818460208701613571565b8082018082111561067a5761067a614055565b67ffffffffffffffff83168152604060208201526000825160a0604084015261455960e0840182613595565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145958383613595565b925060408601519150808584030160808601526145b283836136a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145f08282613595565b9695505050505050565b60006020828403121561460c57600080fd5b5051919050565b60006020828403121561462557600080fd5b815161262e81613546565b8181038181111561067a5761067a614055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -284,28 +284,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetMessageContents(m 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) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _SelfFundedPingPong.Contract.GetMessageStatus(&_SelfFundedPingPong.CallOpts, messageId) -} - -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) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "getRouter") @@ -350,6 +328,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) IsApprovedSender(sou return _SelfFundedPingPong.Contract.IsApprovedSender(&_SelfFundedPingPong.CallOpts, sourceChainSelector, senderAddr) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "isFailedMessage", messageId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _SelfFundedPingPong.Contract.IsFailedMessage(&_SelfFundedPingPong.CallOpts, messageId) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _SelfFundedPingPong.Contract.IsFailedMessage(&_SelfFundedPingPong.CallOpts, messageId) +} + func (_SelfFundedPingPong *SelfFundedPingPongCaller) IsPaused(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "isPaused") @@ -588,30 +588,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpart(c 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) } @@ -684,18 +660,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateRouter(new return _SelfFundedPingPong.Contract.UpdateRouter(&_SelfFundedPingPong.TransactOpts, newRouter) } -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) } @@ -3147,12 +3111,12 @@ type SelfFundedPingPongInterface 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) + IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) + IsPaused(opts *bind.CallOpts) (bool, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -3185,10 +3149,6 @@ type SelfFundedPingPongInterface interface { SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartAddress(opts *bind.TransactOpts, counterpartAddress common.Address) (*types.Transaction, error) - - SetCounterpartChainSelector(opts *bind.TransactOpts, counterpartChainSelector uint64) (*types.Transaction, error) - SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) @@ -3201,8 +3161,6 @@ type SelfFundedPingPongInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(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 9b472c76ae..ad0d1fc40b 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,11 +5,11 @@ 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 fcb85edfc871504a5146db2e3951193c2de089fe491dd7a2fbc755fd92725cac burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 17bcd03828f43f50028bc4d66fdfb0cf576aaf28895d8f86c6ff598159a0cd64 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6f40135e1488097eafa843839a719fe9a3c21354565b64eb377a24a0a55782ef -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 4932475a952db4147b70dab5d4e21c38bd0c7c8af1698bbe85d6759f0e0e3b53 -ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin cb4576ac3190fd904ead1857cedf53456daf68f733560d165187f3742748d1cd -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 0d7d496ff6aaf37fcf8db25c708b6977c841650027a2028c864f7a0e17fa7b08 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin e6bfb15f1f320cceb76435f49b43c90bfcfc69b4561c811c4b938a6356a23566 -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin e142b529faf36c9dbc55be72947493f235e1d6ac2d76658a2273ac8e53ac4f5e +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin da8d9b35e8972481ff573d93426d51dbcb0fde328eccd2456a59fbea34a701ef +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 21a99f1044d89a336253f45bc659e1bd531862351a816b56af0525491f8b08c3 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 6478dd770e6bb3f9d4e722373fec0fb6bae3128096841b9333c2bfe07630e044 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 8eba2225b9387475373bb162e065a3e2cac738226727d39ddb8f3b66f5b649b9 +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 2803129cd6282e281395e049fcb01f85b9ad1e82835ad75249431d19b4f818d5 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c06c1cf1d004a803585a2c9d7a71ee5997b5fca86c2e111335cb8b930d9e3b5a 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 @@ -29,12 +29,12 @@ 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 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 78b23e61461e2ec590c7116955244d9f7f621c7712879e8b69583dcbb8ad0648 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 36a8a376472c27fd0c53ff0b1e681e2acba26d2847a72a3243475d5ea5c40a3d 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 7b2a47349d3fdb8d8b4e206d68577219deca7fabd1e893686fa8f118ad980d2d report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 63113c0443c4584873f959ef677f35fd0b365ad78b7497b79fb3d79a6c06abd3 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 897b1ff2115ff7a3deef441bab7f516d3ac05f0d7c633ad1199e23dd0f5731d0 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin a54136ed9bffc74fff830c5066dbfcee6db1f31d636795317267d6baf1e0427a From 4c049868e6afdd9aabff2cfc483f91a3bc8ca0d5 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 16 Jul 2024 14:42:11 -0400 Subject: [PATCH 49/61] reintroduce EtherSenderReceiver Tests that were previously deprecated --- contracts/gas-snapshots/ccip.gas-snapshot | 109 +-- .../internal/EtherSenderReceiverTest.t.sol | 718 ++++++++++++++++++ 2 files changed, 782 insertions(+), 45 deletions(-) create mode 100644 contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index b9ed9a91b7..92ad59633c 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -35,15 +35,15 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243552) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientTest:test_HappyPath_Success() (gas: 192126) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326927) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219968) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376836) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326596) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219701) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376505) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) -CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331807) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331540) CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 416038) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348558) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242678) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 553108) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348231) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242411) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552844) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -108,13 +108,13 @@ CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423644) CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20854) CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 55404) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331763) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331496) CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 416017) CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2879800) CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74845) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339353) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224534) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367897) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339022) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224267) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367566) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -143,8 +143,6 @@ 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) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) -DefensiveExampleTest:test_Recovery() (gas: 424253) E2E:test_E2E_3MessagesSuccess_gas() (gas: 1102697) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38172) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108340) @@ -221,7 +219,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181595) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190875) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48050) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 436532) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1587903) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 251770) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 173962) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193657) @@ -247,8 +245,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207875) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26001) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152861) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507728) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2308170) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1659264) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3343759) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209881) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210458) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 669850) @@ -399,7 +397,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165036) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177824) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 402506) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1553903) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159387) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174622) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248634) @@ -431,14 +429,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131682) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483468) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1635112) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186553) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25997) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188658) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188105) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027493) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3087683) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143943) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -519,27 +517,48 @@ EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15294) EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 43376) EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21646) EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 55086) -EVM2EVMOnRamp_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: 469442) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57290) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14683) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84800) -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: 14519) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14295) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84069) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17387) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83261) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15293) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272260) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53472) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12856) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13464) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16449) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 13994) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61759) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 469097) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57255) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14665) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84455) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60637) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 173677) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 190338) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53596) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14493) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14277) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84017) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17369) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 82980) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15275) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272015) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53446) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12830) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96729) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 47688) +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) LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11058) LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35097) LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10970) @@ -704,11 +723,11 @@ 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: 380711) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 179111) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380130) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 178848) PingPong_example_plumbing:test_Pausing_Success() (gas: 17833) PingPong_example_plumbing:test_typeAndVersion() (gas: 9741) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203453) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203186) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -856,8 +875,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: 268794) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 445605) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 268720) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444136) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) diff --git a/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol new file mode 100644 index 0000000000..29d5c9a8f6 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol @@ -0,0 +1,718 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Test} from "forge-std/Test.sol"; + +import {CCIPRouter} from "../../../applications/internal/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"); + } +} \ No newline at end of file From f9f20d5156436f6b74d1c14fa6aa874ae0ef8bfc Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 16 Jul 2024 14:49:54 -0400 Subject: [PATCH 50/61] forge fmt --- .../test/applications/internal/EtherSenderReceiverTest.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol index 29d5c9a8f6..9f335ef763 100644 --- a/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/EtherSenderReceiverTest.t.sol @@ -715,4 +715,4 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTest { uint256 routerAllowance = s_weth.allowance(address(s_etherSenderReceiver), ROUTER); assertEq(routerAllowance, type(uint256).max, "router allowance must be max for weth"); } -} \ No newline at end of file +} From 7462cc7d5a188bfef846d90ba3ac1e28992a6ee4 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 17 Jul 2024 12:55:35 -0400 Subject: [PATCH 51/61] formatting fixes and rework CCIPClient Pre-funding mechanism --- contracts/gas-snapshots/ccip.gas-snapshot | 50 ++++++++++--------- .../ccip/applications/external/CCIPBase.sol | 6 +-- .../ccip/applications/external/CCIPClient.sol | 18 +++++-- .../external/CCIPClientWithACK.sol | 38 +++++++++----- .../applications/external/CCIPReceiver.sol | 10 ++-- .../external/CCIPReceiverWithACK.sol | 6 +-- .../ccip/applications/external/CCIPSender.sol | 25 +++++----- .../applications/internal/PingPongDemo.sol | 4 +- .../external/CCIPClientTest.t.sol | 40 ++++++++++++++- .../external/CCIPClientWithACKTest.t.sol | 44 ++++++++++++++-- .../external/CCIPReceiverWithAckTest.t.sol | 4 +- .../internal/PingPongDemoTest.t.sol | 2 +- 12 files changed, 175 insertions(+), 72 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 92ad59633c..79f29a80a2 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,16 +34,18 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243552) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_HappyPath_Success() (gas: 192126) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326596) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219701) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376505) +CCIPClientTest:test_HappyPath_Success() (gas: 192108) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326641) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219791) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376550) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) -CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331540) -CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 416038) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 348231) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242411) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552844) +CCIPClientTest:test_send_with_preFundedFeeTokens_Success() (gas: 678033) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328257) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415411) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 347055) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 243275) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 553519) +CCIPClientWithACKTest:test_send_with_preFundedFeeTokens_Success() (gas: 710532) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -107,10 +109,10 @@ CCIPReceiverTest:test_modifyRouter_Success() (gas: 26449) CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 405385) CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423644) CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20854) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 55404) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 331496) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 416017) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2879800) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 53245) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 328115) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415315) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2834492) CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74845) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339022) CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224267) @@ -219,7 +221,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181595) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190875) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48050) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1587903) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1592510) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 251770) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 173962) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193657) @@ -245,8 +247,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207875) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26001) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152861) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1659264) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3343759) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1663871) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3348359) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209881) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210458) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 669850) @@ -397,7 +399,7 @@ EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458) EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165036) EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177824) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317) -EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1553903) +EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 1558510) EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159387) EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174622) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248634) @@ -429,14 +431,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131682) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1635112) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1639719) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186553) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25997) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188658) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188105) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3087683) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3092283) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143943) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -724,8 +726,8 @@ 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: 380130) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 178848) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17833) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 178804) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17923) PingPong_example_plumbing:test_typeAndVersion() (gas: 9741) PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203186) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) @@ -875,9 +877,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: 268720) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444136) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 268718) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 443986) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20259) 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/external/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 1c18da79f2..3f1b709d2c 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -164,12 +164,10 @@ abstract contract CCIPBase is OwnerIsCreator { // The existence of a stored recipient is used to denote a chain being enabled, so the length here cannot be zero if (chain.recipient.length == 0) revert ZeroAddressNotAllowed(); - ChainConfig storage currentConfig = s_chainConfigs[chain.chainSelector]; - - currentConfig.recipient = chain.recipient; + s_chainConfigs[chain.chainSelector].recipient = chain.recipient; // Set any additional args such as enabling out-of-order execution or manual gas-limit - currentConfig.extraArgsBytes = chain.extraArgsBytes; + s_chainConfigs[chain.chainSelector].extraArgsBytes = chain.extraArgsBytes; emit ChainAdded(chain.chainSelector, chain.recipient, chain.extraArgsBytes); } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 9d2f82b7f3..607006ea26 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -19,12 +19,18 @@ contract CCIPClient is CCIPReceiver { event MessageSent(bytes32 messageId); event FeeTokenUpdated(address oldFeeToken, address newFeeToken); + event PreFundingStateUpdated(bool usePreFunding); + + bool public s_shouldUsePreFunding; /// @dev A check for the zero-address is not explicitly performed since it is included in the CCIPBase parent constructor - constructor(address router, IERC20 feeToken) CCIPReceiver(router) { + constructor(address router, IERC20 feeToken, bool usePreFunding) CCIPReceiver(router) { s_feeToken = feeToken; + s_shouldUsePreFunding = usePreFunding; - IERC20(s_feeToken).safeApprove(s_ccipRouter, type(uint256).max); + if (address(feeToken) != address(0)) { + IERC20(s_feeToken).safeApprove(s_ccipRouter, type(uint256).max); + } } /// @notice sends a message through CCIP to the router @@ -49,7 +55,7 @@ contract CCIPClient is CCIPReceiver { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); // To support pre-funding, if the contract already posesses enough tokens to pay the fee, then a transferFrom is - // not necesarry. This branch must be performed before transfering tokens in tokenAmounts[], since in the case + // not necessary. This branch must be performed before transfering tokens in tokenAmounts[], since in the case // where tokenAmounts[] contains the fee token, then balanceOf may double count tokens improperly and cause // unexpected behavior. if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { @@ -93,4 +99,10 @@ contract CCIPClient is CCIPReceiver { emit FeeTokenUpdated(oldFeeToken, token); } + + function updatePreFundingStatus(bool usePreFunding) external onlyOwner { + s_shouldUsePreFunding = usePreFunding; + + emit PreFundingStateUpdated(usePreFunding); + } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index af882e582e..ec019105f1 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -9,20 +9,29 @@ 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"; /// @title CCIPClientWithACK -/// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. -/// @dev ccipReceive functionality has been inherited fromCCIPReceiverWithACK, and so only ccipSend functionality must be implemented +/// @notice This contract implements logic for sending and receiving CCIP Messages, as well as responding to incoming +/// messages with an ACK-response pattern. It utilizes CCIPReceiver's defensive patterns by default. +/// @dev ccipReceive functionality has been inherited fromCCIPReceiverWithACK, and so only ccipSend functionality must +/// be implemented contract CCIPClientWithACK is CCIPReceiverWithACK { using SafeERC20 for IERC20; error CannotAcknowledgeUnsentMessage(bytes32); - constructor(address router, IERC20 feeToken) CCIPReceiverWithACK(router, feeToken) {} + event PreFundingStateUpdated(bool usePreFunding); + + bool public s_shouldUsePreFunding; + + constructor(address router, IERC20 feeToken, bool usePreFunding) CCIPReceiverWithACK(router, feeToken) { + s_shouldUsePreFunding = usePreFunding; + } /// @notice sends a message through CCIP to the router /// @param destChainSelector The unique CCIP identifier for a destination chain /// @param tokenAmounts An array of CCIP compatible tokens and their amounts to send through the bridge /// @param data Arbitrary bytes to be sent to the destination address on the destination chain - /// @dev The recipient of the message and any extraArgs are set manually ahead of time using the applyChainUpdates() function in CCIPBase + /// @dev The recipient of the message and any extraArgs are set manually ahead of time using the applyChainUpdates() + /// function in CCIPBase /// @return messageId the unique message ID generated by the CCIP router and used to track message status. function ccipSend( uint64 destChainSelector, @@ -37,15 +46,6 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { feeToken: address(s_feeToken) }); - uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - - // Additional tokens for fees do not need to be approved to the router since it is already handled by setting s_feeToken - // Fee transfers need first, that way balanceOf(address(this)) does not conflict with any tokens sent in tokenAmounts - // to support fee-token pre-funding - if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { - IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); - } - 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); @@ -56,6 +56,12 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { } } + uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); + + if (!s_shouldUsePreFunding) { + IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); + } + messageId = IRouterClient(s_ccipRouter).ccipSend{value: address(s_feeToken) == address(0) ? fee : 0}( destChainSelector, message ); @@ -66,4 +72,10 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { return messageId; } + + function updatePreFundingStatus(bool usePreFunding) external onlyOwner { + s_shouldUsePreFunding = usePreFunding; + + emit PreFundingStateUpdated(usePreFunding); + } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 71ca39b502..2bc2cc87a0 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -10,7 +10,8 @@ import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contra /// @title CCIPReceiver /// @notice This contract is capable of receiving incoming messages from the CCIP Router. -/// @dev This contract implements various "defensive" measures to enhance security and efficiency. These include the ability to implement custom-retry logic and ownership-based token-recovery functions. +/// @dev This contract implements various "defensive" measures to enhance security and efficiency. These include the +/// ability to implement custom-retry logic and ownership-based token-recovery functions. contract CCIPReceiver is CCIPBase { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.Bytes32Set; @@ -79,13 +80,14 @@ contract CCIPReceiver is CCIPBase { // ================================================================ /// @notice Executes a message that failed initial delivery, but with different logic specifically for re-execution. - /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the Owner as well. - /// Function will revert if the messageId was not already stored as having failed its initial execution + /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the + ///Owner as well. 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.contains(messageId)) revert MessageNotFailed(messageId); - // Allow developer to implement arbitrary functionality on retried messages, such as 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]; // Set remove the message from storage to disallow reentry and retry the same failed message multiple times. diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 1304f10091..84e3537532 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -46,7 +46,7 @@ contract CCIPReceiverWithACK is CCIPReceiver { MessageType messageType; // Denotes whether the incoming message is being received for the first time, or is an acknowledgement that the initial outgoing correspondence was successfully received. } - string public constant ACK_MESSAGE_HEADER = "MESSAGE_ACKNOWLEDGED_"; + bytes32 public constant ACK_MESSAGE_HEADER = keccak256("MESSAGE_ACKNOWLEDGED_"); // Current feeToken IERC20 public s_feeToken; @@ -100,10 +100,10 @@ contract CCIPReceiverWithACK is CCIPReceiver { return; } else if (payload.messageType == MessageType.ACK) { // Decode message into the message header and the messageId to ensure the message is encoded correctly - (string memory messageHeader, bytes32 messageId) = abi.decode(payload.data, (string, bytes32)); + (bytes32 messageHeader, bytes32 messageId) = abi.decode(payload.data, (bytes32, bytes32)); // Ensure Ack Message contains proper message header. Must abi.encode() before hashing since its of the string type - if (keccak256(bytes(messageHeader)) != keccak256(bytes(ACK_MESSAGE_HEADER))) { + if (messageHeader != ACK_MESSAGE_HEADER) { revert InvalidAckMessageHeader(); } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol index ef21876490..a88c82d3d4 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -10,18 +10,19 @@ 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"; /// @notice Example of a client which supports sending messages to 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. +/// @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. +/// @dev The ccipSend function does not support pre-funding message-fees, and must acquire fee-tokens from the +/// user before the call to the router is made contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 3e31e0c557..5da5d14070 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -21,10 +21,10 @@ contract PingPongDemo is CCIPClient { bool private s_isPaused; // CCIPClient will handle the token approval so there's no need to do it here - constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken) {} + constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken, true) {} function typeAndVersion() external pure virtual returns (string memory) { - return "PingPongDemo 1.6.0"; + return "PingPongDemo 1.6.0-dev"; } function startPingPong() external onlyOwner { 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 79b48826b3..fa94e96e73 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 @@ -20,7 +20,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { function setUp() public virtual override { EVM2EVMOnRampSetup.setUp(); - s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + s_sender = new CCIPClient(address(s_sourceRouter), IERC20(s_sourceFeeToken), false); CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); chainUpdates[0] = CCIPBase.ChainUpdate({ @@ -168,4 +168,42 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { }) ); } + + function test_send_with_preFundedFeeTokens_Success() public { + // Update pre-funding state + s_sender.updatePreFundingStatus(true); + + assertTrue(s_sender.s_shouldUsePreFunding(), "Pre funding should be enabled instead of disabled"); + + // Deal fee tokens to the contract to pre-fund the message execution + deal(address(s_sourceFeeToken), address(s_sender), 1e24); + + 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); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); + + s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); + assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), feeTokenBalanceBefore - feeTokenAmount); + } } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index 20c4611e5c..c2f9378d99 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -26,7 +26,7 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { function setUp() public virtual override { EVM2EVMOnRampSetup.setUp(); - s_sender = new CCIPClientWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken)); + s_sender = new CCIPClientWithACK(address(s_sourceRouter), IERC20(s_sourceFeeToken), false); CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); chainUpdates[0] = CCIPBase.ChainUpdate({ @@ -79,7 +79,7 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { function test_ccipReceiveAndSendAck_Success() public { bytes32 messageId = keccak256("messageId"); - bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; + bytes32 ackMessageId = 0x07d90483b3ed7831c5402af6402e21ba3740a15e9d0837f7c7effb1cbffb39f7; address token = address(s_sourceFeeToken); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -107,7 +107,7 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); - vm.expectEmit(); + vm.expectEmit(true, true, false, false); emit MessageSent(messageId, ackMessageId); s_sender.ccipReceive( @@ -220,4 +220,42 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); assertEq(IERC20(s_sourceFeeToken).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } + + function test_send_with_preFundedFeeTokens_Success() public { + // Update pre-funding state + s_sender.updatePreFundingStatus(true); + + assertTrue(s_sender.s_shouldUsePreFunding(), "Pre funding should be enabled instead of disabled"); + + // Deal fee tokens to the contract to pre-fund the message execution + deal(address(s_sourceFeeToken), address(s_sender), 1e24); + + 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); + uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); + + s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); + + // Assert that tokens were transfered for bridging + fees + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); + assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), feeTokenBalanceBefore - feeTokenAmount); + } } 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 b3ae03d496..4c16a441bb 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 @@ -43,7 +43,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { function test_ccipReceive_and_respond_with_ack_Success() public { bytes32 messageId = keccak256("messageId"); - bytes32 ackMessageId = 0x37ddbb21a51d4e07877b0de816905ea806b958e7607d951d307030631db076bd; + bytes32 ackMessageId = 0x07d90483b3ed7831c5402af6402e21ba3740a15e9d0837f7c7effb1cbffb39f7; address token = address(s_sourceFeeToken); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -71,7 +71,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)); - vm.expectEmit(); + vm.expectEmit(false, true, false, false); emit MessageSent(messageId, ackMessageId); s_receiver.ccipReceive( diff --git a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol index fadbf2bb73..a15b9744a6 100644 --- a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol @@ -103,6 +103,6 @@ contract PingPong_example_plumbing is PingPongDappSetup { } function test_typeAndVersion() public view { - assertEq(s_pingPong.typeAndVersion(), "PingPongDemo 1.6.0"); + assertEq(s_pingPong.typeAndVersion(), "PingPongDemo 1.6.0-dev"); } } From ed535fd93beacf5e662a7a38e2623992d274cdbd 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, 17 Jul 2024 17:25:43 +0000 Subject: [PATCH 52/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 175 +++++++++++++++- .../ccipClientWithACK/ccipClientWithACK.go | 187 +++++++++++++++++- .../generated/ccipReceiver/ccipReceiver.go | 2 +- .../ccip/generated/ccipSender/ccipSender.go | 2 +- .../ping_pong_demo/ping_pong_demo.go | 171 +++++++++++++++- .../self_funded_ping_pong.go | 171 +++++++++++++++- ...rapper-dependency-versions-do-not-edit.txt | 14 +- 7 files changed, 695 insertions(+), 27 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 1490f0ca84..0186c1177a 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,15 +56,15 @@ 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620042b2380380620042b28339810160408190526200003491620005b9565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000131565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b03199182168117909255600780549386169390911683179055620001299250600019620001dc565b5050620006b6565b336001600160a01b038216036200018b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002589190620005f8565b155b620002ce5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003269185916200032b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037a906001600160a01b038516908490620003fc565b8051909150156200032657808060200190518101906200039b919062000612565b620003265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200040d848460008562000415565b949350505050565b606082471015620004785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000496919062000663565b60006040518083038185875af1925050503d8060008114620004d5576040519150601f19603f3d011682016040523d82523d6000602084013e620004da565b606091505b509092509050620004ee87838387620004f9565b979650505050505050565b606083156200056d57825160000362000565576001600160a01b0385163b620005655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200040d565b6200040d8383815115620005845781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000681565b6001600160a01b0381168114620005b657600080fd5b50565b60008060408385031215620005cd57600080fd5b8251620005da81620005a0565b6020840151909250620005ed81620005a0565b809150509250929050565b6000602082840312156200060b57600080fd5b5051919050565b6000602082840312156200062557600080fd5b815180151581146200063657600080fd5b9392505050565b60005b838110156200065a57818101518382015260200162000640565b50506000910152565b60008251620006778184602087016200063d565b9190910192915050565b6020815260008251806020840152620006a28160408501602087016200063d565b601f01601f19169190910160400192915050565b613bec80620006c66000396000f3fe6080604052600436106101485760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b4485146103b2578063f2fde38b146103d3578063ff2deec3146103f357600080fd5b8063cf6730f814610372578063e4ca87541461039257600080fd5b8063b0f479a1116100a5578063b0f479a114610307578063c851cc3214610332578063c89245d51461035257600080fd5b80638da5cb5b1461029b5780639fe74e26146102e757600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba5097146102465780638462a2b91461025b57806385572ffb1461027b57600080fd5b80636939cd97146101f95780636d62d6331461022657600080fd5b80630a9094dc146101545780630e958d6b1461018957806335f170ef146101a95780635e35359e146101d757600080fd5b3661014f57005b600080fd5b34801561016057600080fd5b5061017461016f366004612ac5565b610420565b60405190151581526020015b60405180910390f35b34801561019557600080fd5b506101746101a4366004612af4565b610433565b3480156101b557600080fd5b506101c96101c4366004612b79565b61047e565b604051610180929190612c04565b3480156101e357600080fd5b506101f76101f2366004612c54565b6105aa565b005b34801561020557600080fd5b50610219610214366004612ac5565b61067f565b6040516101809190612cf2565b34801561023257600080fd5b506101f7610241366004612d86565b61088a565b34801561025257600080fd5b506101f7610aa1565b34801561026757600080fd5b506101f7610276366004612e02565b610b9e565b34801561028757600080fd5b506101f7610296366004612e6e565b610edf565b3480156102a757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610180565b3480156102f357600080fd5b506101f7610302366004612ea9565b6110e8565b34801561031357600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102c2565b34801561033e57600080fd5b506101f761034d366004612eeb565b611285565b34801561035e57600080fd5b506101f761036d366004612eeb565b611351565b34801561037e57600080fd5b506101f761038d366004612e6e565b6114bb565b34801561039e57600080fd5b506101f76103ad366004612ac5565b6115f7565b6103c56103c036600461303d565b6118c5565b604051908152602001610180565b3480156103df57600080fd5b506101f76103ee366004612eeb565b611e73565b3480156103ff57600080fd5b506007546102c29073ffffffffffffffffffffffffffffffffffffffff1681565b600061042d600583611e87565b92915050565b67ffffffffffffffff83166000908152600360205260408082209051600290910190610462908590859061314a565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104999061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546104c59061315a565b80156105125780601f106104e757610100808354040283529160200191610512565b820191906000526020600020905b8154815290600101906020018083116104f557829003601f168201915b5050505050908060010180546105279061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546105539061315a565b80156105a05780601f10610575576101008083540402835291602001916105a0565b820191906000526020600020905b81548152906001019060200180831161058357829003601f168201915b5050505050905082565b6105b2611ea2565b73ffffffffffffffffffffffffffffffffffffffff83166105f2576105ed73ffffffffffffffffffffffffffffffffffffffff831682611f25565b610613565b61061373ffffffffffffffffffffffffffffffffffffffff8416838361207f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161067291815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916106ee9061315a565b80601f016020809104026020016040519081016040528092919081815260200182805461071a9061315a565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b505050505081526020016003820180546107809061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac9061315a565b80156107f95780601f106107ce576101008083540402835291602001916107f9565b820191906000526020600020905b8154815290600101906020018083116107dc57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561087c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610827565b505050915250909392505050565b610892611ea2565b61089d600583611e87565b6108db576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561095c5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610907565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506109ac6002830182612a13565b6109ba600383016000612a13565b6109c8600483016000612a4d565b506109d69050600584612153565b5060005b8151811015610a5057610a48838383815181106109f9576109f96131ad565b602002602001015160200151848481518110610a1757610a176131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661207f9092919063ffffffff16565b6001016109da565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108d2565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ba6611ea2565b60005b81811015610d395760036000848484818110610bc757610bc76131ad565b9050602002810190610bd991906131dc565b610be7906020810190612b79565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c1e57610c1e6131ad565b9050602002810190610c3091906131dc565b610c3e90602081019061321a565b604051610c4c92919061314a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610c9357610c936131ad565b9050602002810190610ca591906131dc565b610cb390602081019061321a565b604051610cc192919061314a565b6040518091039020838383818110610cdb57610cdb6131ad565b9050602002810190610ced91906131dc565b610cfb906020810190612b79565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ba9565b5060005b83811015610ed857600160036000878785818110610d5d57610d5d6131ad565b9050602002810190610d6f91906131dc565b610d7d906020810190612b79565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610db457610db46131ad565b9050602002810190610dc691906131dc565b610dd490602081019061321a565b604051610de292919061314a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610e3257610e326131ad565b9050602002810190610e4491906131dc565b610e5290602081019061321a565b604051610e6092919061314a565b6040518091039020858583818110610e7a57610e7a6131ad565b9050602002810190610e8c91906131dc565b610e9a906020810190612b79565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610d3d565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610f32576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016108d2565b610f426040820160208301612b79565b67ffffffffffffffff8116600090815260036020526040902080548190610f689061315a565b9050600003610faf576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108d2565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610feb908690600401613381565b600060405180830381600087803b15801561100557600080fd5b505af1925050508015611016575060015b6110b6573d808015611044576040519150601f19603f3d011682016040523d82523d6000602084013e611049565b606091505b506110566005853561215f565b50833560009081526004602052604090208490611073828261375b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110a8908490613855565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6110f0611ea2565b60005b818110156110e357600083838381811061110f5761110f6131ad565b90506020028101906111219190613868565b61112a906138aa565b9050806020015161119557805167ffffffffffffffff16600090815260036020526040812061115891612a13565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261127c565b8060400151516000036111d4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff1660009081526003602052604090819020908201518190611200908261395b565b5060608201516001820190611215908261395b565b5081604001516040516112289190613a75565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284606001516040516112729190613855565b60405180910390a3505b506001016110f3565b61128d611ea2565b73ffffffffffffffffffffffffffffffffffffffff81166112da576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611359611ea2565b60075473ffffffffffffffffffffffffffffffffffffffff16156113ba576113ba61139960025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1690600061216b565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156114675761146761142760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122ed565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b3330146114f4576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115046040820160208301612b79565b611511604083018361321a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506115689250905061315a565b159050806115be5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516115a99190613a75565b9081526040519081900360200190205460ff16155b156110e357806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108d29190613855565b611602600582611e87565b61163b576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016108d2565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916116829061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546116ae9061315a565b80156116fb5780601f106116d0576101008083540402835291602001916116fb565b820191906000526020600020905b8154815290600101906020018083116116de57829003601f168201915b505050505081526020016003820180546117149061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546117409061315a565b801561178d5780601f106117625761010080835404028352916020019161178d565b820191906000526020600020905b81548152906001019060200180831161177057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118105760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016117bb565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506118626002830182612a13565b611870600383016000612a13565b61187e600483016000612a4d565b5061188c9050600583612153565b50611896816123f1565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906118ee9061315a565b9050600003611935576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108d2565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906119659061315a565b80601f01602080910402602001604051908101604052809291908181526020018280546119919061315a565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611a3f9061315a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6b9061315a565b8015611ab85780601f10611a8d57610100808354040283529160200191611ab8565b820191906000526020600020905b815481529060010190602001808311611a9b57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611b1f908b908690600401613a87565b602060405180830381865afa158015611b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b609190613b54565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615801590611c1957506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c179190613b54565b105b15611c4357600754611c439073ffffffffffffffffffffffffffffffffffffffff16333084612463565b60005b8751811015611d9657611cb633308a8481518110611c6657611c666131ad565b6020026020010151602001518b8581518110611c8457611c846131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612463909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611ce657611ce66131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611d8e576002548851611d8e9173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611d3f57611d3f6131ad565b6020026020010151602001518a8481518110611d5d57611d5d6131ad565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661216b9092919063ffffffff16565b600101611c46565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611dc9576000611dcb565b825b8a856040518463ffffffff1660e01b8152600401611dea929190613a87565b60206040518083038185885af1158015611e08573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e2d9190613b54565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611e6091815260200190565b60405180910390a1505050509392505050565b611e7b611ea2565b611e84816124c1565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108d2565b565b80471015611f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108d2565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fe9576040519150601f19603f3d011682016040523d82523d6000602084013e611fee565b606091505b50509050806110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108d2565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526110e39084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125b6565b6000611e9b83836126c2565b6000611e9b83836127b5565b80158061220b57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122099190613b54565b155b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016108d2565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526110e39084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120d1565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123889190613b54565b6123929190613b6d565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506123eb9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120d1565b50505050565b6123f9611ea2565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612435908490600401612cf2565b600060405180830381600087803b15801561244f57600080fd5b505af1158015610ed8573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123eb9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016120d1565b3373ffffffffffffffffffffffffffffffffffffffff821603612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108d2565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612618826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166128049092919063ffffffff16565b8051909150156110e357808060200190518101906126369190613b80565b6110e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108d2565b600081815260018301602052604081205480156127ab5760006126e6600183613b9d565b85549091506000906126fa90600190613b9d565b905081811461275f57600086600001828154811061271a5761271a6131ad565b906000526020600020015490508087600001848154811061273d5761273d6131ad565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061277057612770613bb0565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061042d565b600091505061042d565b60008181526001830160205260408120546127fc5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561042d565b50600061042d565b6060612813848460008561281b565b949350505050565b6060824710156128ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108d2565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128d69190613a75565b60006040518083038185875af1925050503d8060008114612913576040519150601f19603f3d011682016040523d82523d6000602084013e612918565b606091505b509150915061292987838387612934565b979650505050505050565b606083156129ca5782516000036129c35773ffffffffffffffffffffffffffffffffffffffff85163b6129c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108d2565b5081612813565b61281383838151156129df5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29190613855565b508054612a1f9061315a565b6000825580601f10612a2f575050565b601f016020900490600052602060002090810190611e849190612a6e565b5080546000825560020290600052602060002090810190611e849190612a87565b5b80821115612a835760008155600101612a6f565b5090565b5b80821115612a835780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612a88565b600060208284031215612ad757600080fd5b5035919050565b67ffffffffffffffff81168114611e8457600080fd5b600080600060408486031215612b0957600080fd5b8335612b1481612ade565b9250602084013567ffffffffffffffff80821115612b3157600080fd5b818601915086601f830112612b4557600080fd5b813581811115612b5457600080fd5b876020828501011115612b6657600080fd5b6020830194508093505050509250925092565b600060208284031215612b8b57600080fd5b8135611e9b81612ade565b60005b83811015612bb1578181015183820152602001612b99565b50506000910152565b60008151808452612bd2816020860160208601612b96565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612c176040830185612bba565b8281036020840152612c298185612bba565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e8457600080fd5b600080600060608486031215612c6957600080fd5b8335612c7481612c32565b92506020840135612c8481612c32565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612ce7578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612caa565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612d2c60c0840182612bba565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d688383612bba565b925060808601519150808584030160a086015250612c298282612c95565b60008060408385031215612d9957600080fd5b823591506020830135612dab81612c32565b809150509250929050565b60008083601f840112612dc857600080fd5b50813567ffffffffffffffff811115612de057600080fd5b6020830191508360208260051b8501011115612dfb57600080fd5b9250929050565b60008060008060408587031215612e1857600080fd5b843567ffffffffffffffff80821115612e3057600080fd5b612e3c88838901612db6565b90965094506020870135915080821115612e5557600080fd5b50612e6287828801612db6565b95989497509550505050565b600060208284031215612e8057600080fd5b813567ffffffffffffffff811115612e9757600080fd5b820160a08185031215611e9b57600080fd5b60008060208385031215612ebc57600080fd5b823567ffffffffffffffff811115612ed357600080fd5b612edf85828601612db6565b90969095509350505050565b600060208284031215612efd57600080fd5b8135611e9b81612c32565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f5a57612f5a612f08565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fa757612fa7612f08565b604052919050565b600082601f830112612fc057600080fd5b813567ffffffffffffffff811115612fda57612fda612f08565b61300b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f60565b81815284602083860101111561302057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561305257600080fd5b833561305d81612ade565b925060208481013567ffffffffffffffff8082111561307b57600080fd5b818701915087601f83011261308f57600080fd5b8135818111156130a1576130a1612f08565b6130af848260051b01612f60565b81815260069190911b8301840190848101908a8311156130ce57600080fd5b938501935b8285101561311a576040858c0312156130ec5760008081fd5b6130f4612f37565b85356130ff81612c32565b815285870135878201528252604090940193908501906130d3565b96505050604087013592508083111561313257600080fd5b505061314086828701612faf565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061316e57607f821691505b6020821081036131a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261321057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261324f57600080fd5b83018035915067ffffffffffffffff82111561326a57600080fd5b602001915036819003821315612dfb57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132b457600080fd5b830160208101925035905067ffffffffffffffff8111156132d457600080fd5b803603821315612dfb57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612ce757813561334f81612c32565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161333c565b60208152813560208201526000602083013561339c81612ade565b67ffffffffffffffff80821660408501526133ba604086018661327f565b925060a060608601526133d160c0860184836132e3565b9250506133e1606086018661327f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526134178583856132e3565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261345057600080fd5b6020928801928301923591508382111561346957600080fd5b8160061b360383131561347b57600080fd5b8685030160a087015261292984828461332c565b601f8211156110e3576000816000526020600020601f850160051c810160208610156134b85750805b601f850160051c820191505b818110156134d7578281556001016134c4565b505050505050565b67ffffffffffffffff8311156134f7576134f7612f08565b61350b83613505835461315a565b8361348f565b6000601f84116001811461355d57600085156135275750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610ed8565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135ac578685013582556020948501946001909201910161358c565b50868210156135e7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561363381612c32565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561369957613699612f08565b8054838255808410156137265760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146136da576136da6135f9565b80861686146136eb576136eb6135f9565b5060008360005260206000208360011b81018760011b820191505b80821015613721578282558284830155600282019150613706565b505050505b5060008181526020812083915b858110156134d7576137458383613628565b6040929092019160029190910190600101613733565b8135815560018101602083013561377181612ade565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556137b1604086018661321a565b935091506137c38383600287016134df565b6137d0606086018661321a565b935091506137e28383600387016134df565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261381957600080fd5b91840191823591508082111561382e57600080fd5b506020820191508060061b360382131561384757600080fd5b6123eb818360048601613680565b602081526000611e9b6020830184612bba565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261321057600080fd5b8015158114611e8457600080fd5b6000608082360312156138bc57600080fd5b6040516080810167ffffffffffffffff82821081831117156138e0576138e0612f08565b81604052843591506138f182612ade565b9082526020840135906139038261389c565b816020840152604085013591508082111561391d57600080fd5b61392936838701612faf565b6040840152606085013591508082111561394257600080fd5b5061394f36828601612faf565b60608301525092915050565b815167ffffffffffffffff81111561397557613975612f08565b61398981613983845461315a565b8461348f565b602080601f8311600181146139dc57600084156139a65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556134d7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613a2957888601518255948401946001909101908401613a0a565b5085821015613a6557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613210818460208701612b96565b67ffffffffffffffff83168152604060208201526000825160a06040840152613ab360e0840182612bba565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613aef8383612bba565b92506040860151915080858403016080860152613b0c8383612c95565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613b4a8282612bba565b9695505050505050565b600060208284031215613b6657600080fd5b5051919050565b8082018082111561042d5761042d6135f9565b600060208284031215613b9257600080fd5b8151611e9b8161389c565b8181038181111561042d5761042d6135f9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004433380380620044338339810160408190526200003491620005f8565b828033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c0816200015a565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03928316179055600780549185166001600160a81b03199092168217600160a01b85151502179055159050620001515760025460075462000151916001600160a01b03918216911660001962000205565b505050620006ff565b336001600160a01b03821603620001b45760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002835750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200025b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000281919062000647565b155b620002f75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200034f9185916200035416565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003a3906001600160a01b03851690849062000425565b8051909150156200034f5780806020019051810190620003c4919062000661565b6200034f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200043684846000856200043e565b949350505050565b606082471015620004a15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620004bf9190620006ac565b60006040518083038185875af1925050503d8060008114620004fe576040519150601f19603f3d011682016040523d82523d6000602084013e62000503565b606091505b509092509050620005178783838762000522565b979650505050505050565b60608315620005965782516000036200058e576001600160a01b0385163b6200058e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162000436565b620004368383815115620005ad5781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620006ca565b6001600160a01b0381168114620005df57600080fd5b50565b80518015158114620005f357600080fd5b919050565b6000806000606084860312156200060e57600080fd5b83516200061b81620005c9565b60208501519093506200062e81620005c9565b91506200063e60408501620005e2565b90509250925092565b6000602082840312156200065a57600080fd5b5051919050565b6000602082840312156200067457600080fd5b6200067f82620005e2565b9392505050565b60005b83811015620006a357818101518382015260200162000689565b50506000910152565b60008251620006c081846020870162000686565b9190910192915050565b6020815260008251806020840152620006eb81604085016020870162000686565b601f01601f19169190910160400192915050565b613d24806200070f6000396000f3fe60806040526004361061016e5760003560e01c80639fe74e26116100cb578063cf6730f81161007f578063ec4a9a2611610059578063ec4a9a2614610419578063f2fde38b1461044b578063ff2deec31461046b57600080fd5b8063cf6730f8146103b8578063e4ca8754146103d8578063e89b4485146103f857600080fd5b8063c25da3fe116100b0578063c25da3fe14610358578063c851cc3214610378578063c89245d51461039857600080fd5b80639fe74e261461030d578063b0f479a11461032d57600080fd5b80636d62d633116101225780638462a2b9116101075780638462a2b91461028157806385572ffb146102a15780638da5cb5b146102c157600080fd5b80636d62d6331461024c57806379ba50971461026c57600080fd5b806335f170ef1161015357806335f170ef146101cf5780635e35359e146101fd5780636939cd971461021f57600080fd5b80630a9094dc1461017a5780630e958d6b146101af57600080fd5b3661017557005b600080fd5b34801561018657600080fd5b5061019a610195366004612be0565b610498565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b5061019a6101ca366004612c0f565b6104ab565b3480156101db57600080fd5b506101ef6101ea366004612c94565b6104f6565b6040516101a6929190612d1f565b34801561020957600080fd5b5061021d610218366004612d6f565b610622565b005b34801561022b57600080fd5b5061023f61023a366004612be0565b6106f7565b6040516101a69190612e0d565b34801561025857600080fd5b5061021d610267366004612ea1565b610902565b34801561027857600080fd5b5061021d610b19565b34801561028d57600080fd5b5061021d61029c366004612f1d565b610c16565b3480156102ad57600080fd5b5061021d6102bc366004612f89565b610f57565b3480156102cd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b34801561031957600080fd5b5061021d610328366004612fc4565b611160565b34801561033957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102e8565b34801561036457600080fd5b5061021d610373366004613014565b611314565b34801561038457600080fd5b5061021d610393366004613031565b6113a0565b3480156103a457600080fd5b5061021d6103b3366004613031565b61146c565b3480156103c457600080fd5b5061021d6103d3366004612f89565b6115d6565b3480156103e457600080fd5b5061021d6103f3366004612be0565b611712565b61040b610406366004613183565b6119e0565b6040519081526020016101a6565b34801561042557600080fd5b5060075461019a9074010000000000000000000000000000000000000000900460ff1681565b34801561045757600080fd5b5061021d610466366004613031565b611f8e565b34801561047757600080fd5b506007546102e89073ffffffffffffffffffffffffffffffffffffffff1681565b60006104a5600583611fa2565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906104da9085908590613290565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610511906132a0565b80601f016020809104026020016040519081016040528092919081815260200182805461053d906132a0565b801561058a5780601f1061055f5761010080835404028352916020019161058a565b820191906000526020600020905b81548152906001019060200180831161056d57829003601f168201915b50505050509080600101805461059f906132a0565b80601f01602080910402602001604051908101604052809291908181526020018280546105cb906132a0565b80156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905082565b61062a611fbd565b73ffffffffffffffffffffffffffffffffffffffff831661066a5761066573ffffffffffffffffffffffffffffffffffffffff831682612040565b61068b565b61068b73ffffffffffffffffffffffffffffffffffffffff8416838361219a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ea91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610766906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906132a0565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b505050505081526020016003820180546107f8906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610824906132a0565b80156108715780601f1061084657610100808354040283529160200191610871565b820191906000526020600020905b81548152906001019060200180831161085457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f45760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161089f565b505050915250909392505050565b61090a611fbd565b610915600583611fa2565b610953576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b828210156109d45760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161097f565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a246002830182612b2e565b610a32600383016000612b2e565b610a40600483016000612b68565b50610a4e905060058461226e565b5060005b8151811015610ac857610ac083838381518110610a7157610a716132f3565b602002602001015160200151848481518110610a8f57610a8f6132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661219a9092919063ffffffff16565b600101610a52565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c1e611fbd565b60005b81811015610db15760036000848484818110610c3f57610c3f6132f3565b9050602002810190610c519190613322565b610c5f906020810190612c94565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c9657610c966132f3565b9050602002810190610ca89190613322565b610cb6906020810190613360565b604051610cc4929190613290565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d0b57610d0b6132f3565b9050602002810190610d1d9190613322565b610d2b906020810190613360565b604051610d39929190613290565b6040518091039020838383818110610d5357610d536132f3565b9050602002810190610d659190613322565b610d73906020810190612c94565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c21565b5060005b83811015610f5057600160036000878785818110610dd557610dd56132f3565b9050602002810190610de79190613322565b610df5906020810190612c94565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e2c57610e2c6132f3565b9050602002810190610e3e9190613322565b610e4c906020810190613360565b604051610e5a929190613290565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610eaa57610eaa6132f3565b9050602002810190610ebc9190613322565b610eca906020810190613360565b604051610ed8929190613290565b6040518091039020858583818110610ef257610ef26132f3565b9050602002810190610f049190613322565b610f12906020810190612c94565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610db5565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610faa576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094a565b610fba6040820160208301612c94565b67ffffffffffffffff8116600090815260036020526040902080548190610fe0906132a0565b9050600003611027576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110639086906004016134c7565b600060405180830381600087803b15801561107d57600080fd5b505af192505050801561108e575060015b61112e573d8080156110bc576040519150601f19603f3d011682016040523d82523d6000602084013e6110c1565b606091505b506110ce6005853561227a565b508335600090815260046020526040902084906110eb82826138a1565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061112090849061399b565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611168611fbd565b60005b8181101561115b576000838383818110611187576111876132f3565b905060200281019061119991906139ae565b6111a2906139e2565b9050806020015161120d57805167ffffffffffffffff1660009081526003602052604081206111d091612b2e565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261130b565b80604001515160000361124c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112779082613a93565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906112a59082613a93565b5080604001516040516112b89190613bad565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128360600151604051611302919061399b565b60405180910390a35b5060010161116b565b61131c611fbd565b6007805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b9061139590831515815260200190565b60405180910390a150565b6113a8611fbd565b73ffffffffffffffffffffffffffffffffffffffff81166113f5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611474611fbd565b60075473ffffffffffffffffffffffffffffffffffffffff16156114d5576114d56114b460025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612286565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115825761158261154260025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612408565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461160f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61161f6040820160208301612c94565b61162c6040830183613360565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611683925090506132a0565b159050806116d95750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116c49190613bad565b9081526040519081900360200190205460ff16155b1561115b57806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094a919061399b565b61171d600582611fa2565b611756576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094a565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161179d906132a0565b80601f01602080910402602001604051908101604052809291908181526020018280546117c9906132a0565b80156118165780601f106117eb57610100808354040283529160200191611816565b820191906000526020600020905b8154815290600101906020018083116117f957829003601f168201915b5050505050815260200160038201805461182f906132a0565b80601f016020809104026020016040519081016040528092919081815260200182805461185b906132a0565b80156118a85780601f1061187d576101008083540402835291602001916118a8565b820191906000526020600020905b81548152906001019060200180831161188b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561192b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016118d6565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905591925061197d6002830182612b2e565b61198b600383016000612b2e565b611999600483016000612b68565b506119a7905060058361226e565b506119b18161250c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611a09906132a0565b9050600003611a50576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094a565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611a80906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac906132a0565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611b5a906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611b86906132a0565b8015611bd35780601f10611ba857610100808354040283529160200191611bd3565b820191906000526020600020905b815481529060010190602001808311611bb657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611c3a908b908690600401613bbf565b602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190613c8c565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615801590611d3457506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d329190613c8c565b105b15611d5e57600754611d5e9073ffffffffffffffffffffffffffffffffffffffff1633308461257e565b60005b8751811015611eb157611dd133308a8481518110611d8157611d816132f3565b6020026020010151602001518b8581518110611d9f57611d9f6132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661257e909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611e0157611e016132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611ea9576002548851611ea99173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611e5a57611e5a6132f3565b6020026020010151602001518a8481518110611e7857611e786132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122869092919063ffffffff16565b600101611d61565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611ee4576000611ee6565b825b8a856040518463ffffffff1660e01b8152600401611f05929190613bbf565b60206040518083038185885af1158015611f23573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f489190613c8c565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611f7b91815260200190565b60405180910390a1505050509392505050565b611f96611fbd565b611f9f816125dc565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094a565b565b804710156120aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612104576040519150601f19603f3d011682016040523d82523d6000602084013e612109565b606091505b505090508061115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261115b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526126d1565b6000611fb683836127dd565b6000611fb683836128d0565b80158061232657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123249190613c8c565b155b6123b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161094a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261115b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016121ec565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190613c8c565b6124ad9190613ca5565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506125069085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016121ec565b50505050565b612514611fbd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612550908490600401612e0d565b600060405180830381600087803b15801561256a57600080fd5b505af1158015610f50573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526125069085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016121ec565b3373ffffffffffffffffffffffffffffffffffffffff82160361265b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612733826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661291f9092919063ffffffff16565b80519091501561115b57808060200190518101906127519190613cb8565b61115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094a565b600081815260018301602052604081205480156128c6576000612801600183613cd5565b855490915060009061281590600190613cd5565b905081811461287a576000866000018281548110612835576128356132f3565b9060005260206000200154905080876000018481548110612858576128586132f3565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061288b5761288b613ce8565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a5565b60009150506104a5565b6000818152600183016020526040812054612917575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a5565b5060006104a5565b606061292e8484600085612936565b949350505050565b6060824710156129c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129f19190613bad565b60006040518083038185875af1925050503d8060008114612a2e576040519150601f19603f3d011682016040523d82523d6000602084013e612a33565b606091505b5091509150612a4487838387612a4f565b979650505050505050565b60608315612ae5578251600003612ade5773ffffffffffffffffffffffffffffffffffffffff85163b612ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094a565b508161292e565b61292e8383815115612afa5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a919061399b565b508054612b3a906132a0565b6000825580601f10612b4a575050565b601f016020900490600052602060002090810190611f9f9190612b89565b5080546000825560020290600052602060002090810190611f9f9190612ba2565b5b80821115612b9e5760008155600101612b8a565b5090565b5b80821115612b9e5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612ba3565b600060208284031215612bf257600080fd5b5035919050565b67ffffffffffffffff81168114611f9f57600080fd5b600080600060408486031215612c2457600080fd5b8335612c2f81612bf9565b9250602084013567ffffffffffffffff80821115612c4c57600080fd5b818601915086601f830112612c6057600080fd5b813581811115612c6f57600080fd5b876020828501011115612c8157600080fd5b6020830194508093505050509250925092565b600060208284031215612ca657600080fd5b8135611fb681612bf9565b60005b83811015612ccc578181015183820152602001612cb4565b50506000910152565b60008151808452612ced816020860160208601612cb1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612d326040830185612cd5565b8281036020840152612d448185612cd5565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611f9f57600080fd5b600080600060608486031215612d8457600080fd5b8335612d8f81612d4d565b92506020840135612d9f81612d4d565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612e02578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612dc5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612e4760c0840182612cd5565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612e838383612cd5565b925060808601519150808584030160a086015250612d448282612db0565b60008060408385031215612eb457600080fd5b823591506020830135612ec681612d4d565b809150509250929050565b60008083601f840112612ee357600080fd5b50813567ffffffffffffffff811115612efb57600080fd5b6020830191508360208260051b8501011115612f1657600080fd5b9250929050565b60008060008060408587031215612f3357600080fd5b843567ffffffffffffffff80821115612f4b57600080fd5b612f5788838901612ed1565b90965094506020870135915080821115612f7057600080fd5b50612f7d87828801612ed1565b95989497509550505050565b600060208284031215612f9b57600080fd5b813567ffffffffffffffff811115612fb257600080fd5b820160a08185031215611fb657600080fd5b60008060208385031215612fd757600080fd5b823567ffffffffffffffff811115612fee57600080fd5b612ffa85828601612ed1565b90969095509350505050565b8015158114611f9f57600080fd5b60006020828403121561302657600080fd5b8135611fb681613006565b60006020828403121561304357600080fd5b8135611fb681612d4d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156130a0576130a061304e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130ed576130ed61304e565b604052919050565b600082601f83011261310657600080fd5b813567ffffffffffffffff8111156131205761312061304e565b61315160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016130a6565b81815284602083860101111561316657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561319857600080fd5b83356131a381612bf9565b925060208481013567ffffffffffffffff808211156131c157600080fd5b818701915087601f8301126131d557600080fd5b8135818111156131e7576131e761304e565b6131f5848260051b016130a6565b81815260069190911b8301840190848101908a83111561321457600080fd5b938501935b82851015613260576040858c0312156132325760008081fd5b61323a61307d565b853561324581612d4d565b81528587013587820152825260409094019390850190613219565b96505050604087013592508083111561327857600080fd5b5050613286868287016130f5565b9150509250925092565b8183823760009101908152919050565b600181811c908216806132b457607f821691505b6020821081036132ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261335657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261339557600080fd5b83018035915067ffffffffffffffff8211156133b057600080fd5b602001915036819003821315612f1657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126133fa57600080fd5b830160208101925035905067ffffffffffffffff81111561341a57600080fd5b803603821315612f1657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612e0257813561349581612d4d565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613482565b6020815281356020820152600060208301356134e281612bf9565b67ffffffffffffffff808216604085015261350060408601866133c5565b925060a0606086015261351760c086018483613429565b92505061352760608601866133c5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261355d858385613429565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261359657600080fd5b602092880192830192359150838211156135af57600080fd5b8160061b36038313156135c157600080fd5b8685030160a0870152612a44848284613472565b601f82111561115b576000816000526020600020601f850160051c810160208610156135fe5750805b601f850160051c820191505b8181101561361d5782815560010161360a565b505050505050565b67ffffffffffffffff83111561363d5761363d61304e565b6136518361364b83546132a0565b836135d5565b6000601f8411600181146136a3576000851561366d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f50565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156136f257868501358255602094850194600190920191016136d2565b508682101561372d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561377981612d4d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156137df576137df61304e565b80548382558084101561386c5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146138205761382061373f565b80861686146138315761383161373f565b5060008360005260206000208360011b81018760011b820191505b8082101561386757828255828483015560028201915061384c565b505050505b5060008181526020812083915b8581101561361d5761388b838361376e565b6040929092019160029190910190600101613879565b813581556001810160208301356138b781612bf9565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556138f76040860186613360565b93509150613909838360028701613625565b6139166060860186613360565b93509150613928838360038701613625565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261395f57600080fd5b91840191823591508082111561397457600080fd5b506020820191508060061b360382131561398d57600080fd5b6125068183600486016137c6565b602081526000611fb66020830184612cd5565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261335657600080fd5b6000608082360312156139f457600080fd5b6040516080810167ffffffffffffffff8282108183111715613a1857613a1861304e565b8160405284359150613a2982612bf9565b908252602084013590613a3b82613006565b8160208401526040850135915080821115613a5557600080fd5b613a61368387016130f5565b60408401526060850135915080821115613a7a57600080fd5b50613a87368286016130f5565b60608301525092915050565b815167ffffffffffffffff811115613aad57613aad61304e565b613ac181613abb84546132a0565b846135d5565b602080601f831160018114613b145760008415613ade5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561361d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b6157888601518255948401946001909101908401613b42565b5085821015613b9d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613356818460208701612cb1565b67ffffffffffffffff83168152604060208201526000825160a06040840152613beb60e0840182612cd5565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613c278383612cd5565b92506040860151915080858403016080860152613c448383612db0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613c828282612cd5565b9695505050505050565b600060208284031215613c9e57600080fd5b5051919050565b808201808211156104a5576104a561373f565b600060208284031215613cca57600080fd5b8151611fb681613006565b818103818111156104a5576104a561373f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } 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) { +func DeployCCIPClient(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address, usePreFunding bool) (common.Address, *types.Transaction, *CCIPClient, error) { parsed, err := CCIPClientMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -73,7 +73,7 @@ func DeployCCIPClient(auth *bind.TransactOpts, backend bind.ContractBackend, rou return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPClientBin), backend, router, feeToken) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPClientBin), backend, router, feeToken, usePreFunding) if err != nil { return common.Address{}, nil, nil, err } @@ -358,6 +358,28 @@ func (_CCIPClient *CCIPClientCallerSession) SFeeToken() (common.Address, error) return _CCIPClient.Contract.SFeeToken(&_CCIPClient.CallOpts) } +func (_CCIPClient *CCIPClientCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "s_shouldUsePreFunding") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) SShouldUsePreFunding() (bool, error) { + return _CCIPClient.Contract.SShouldUsePreFunding(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) SShouldUsePreFunding() (bool, error) { + return _CCIPClient.Contract.SShouldUsePreFunding(&_CCIPClient.CallOpts) +} + func (_CCIPClient *CCIPClientTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -478,6 +500,18 @@ func (_CCIPClient *CCIPClientTransactorSession) UpdateFeeToken(token common.Addr return _CCIPClient.Contract.UpdateFeeToken(&_CCIPClient.TransactOpts, token) } +func (_CCIPClient *CCIPClientTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { + return _CCIPClient.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) +} + +func (_CCIPClient *CCIPClientSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdatePreFundingStatus(&_CCIPClient.TransactOpts, usePreFunding) +} + +func (_CCIPClient *CCIPClientTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _CCIPClient.Contract.UpdatePreFundingStatus(&_CCIPClient.TransactOpts, usePreFunding) +} + func (_CCIPClient *CCIPClientTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "updateRouter", newRouter) } @@ -2203,6 +2237,123 @@ func (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferred(log types.Log) return event, nil } +type CCIPClientPreFundingStateUpdatedIterator struct { + Event *CCIPClientPreFundingStateUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientPreFundingStateUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientPreFundingStateUpdated) + 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(CCIPClientPreFundingStateUpdated) + 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 *CCIPClientPreFundingStateUpdatedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientPreFundingStateUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientPreFundingStateUpdated struct { + UsePreFunding bool + Raw types.Log +} + +func (_CCIPClient *CCIPClientFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientPreFundingStateUpdatedIterator, error) { + + logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return &CCIPClientPreFundingStateUpdatedIterator{contract: _CCIPClient.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil +} + +func (_CCIPClient *CCIPClientFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientPreFundingStateUpdated) (event.Subscription, error) { + + logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientPreFundingStateUpdated) + if err := _CCIPClient.contract.UnpackLog(event, "PreFundingStateUpdated", 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) ParsePreFundingStateUpdated(log types.Log) (*CCIPClientPreFundingStateUpdated, error) { + event := new(CCIPClientPreFundingStateUpdated) + if err := _CCIPClient.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CCIPClientTokensWithdrawnByOwnerIterator struct { Event *CCIPClientTokensWithdrawnByOwner @@ -2373,6 +2524,8 @@ func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, err return _CCIPClient.ParseOwnershipTransferRequested(log) case _CCIPClient.abi.Events["OwnershipTransferred"].ID: return _CCIPClient.ParseOwnershipTransferred(log) + case _CCIPClient.abi.Events["PreFundingStateUpdated"].ID: + return _CCIPClient.ParsePreFundingStateUpdated(log) case _CCIPClient.abi.Events["TokensWithdrawnByOwner"].ID: return _CCIPClient.ParseTokensWithdrawnByOwner(log) @@ -2433,6 +2586,10 @@ func (CCIPClientOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (CCIPClientPreFundingStateUpdated) Topic() common.Hash { + return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") +} + func (CCIPClientTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -2458,6 +2615,8 @@ type CCIPClientInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) + SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) @@ -2478,6 +2637,8 @@ type CCIPClientInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2562,6 +2723,12 @@ type CCIPClientInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPClientOwnershipTransferred, error) + FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientPreFundingStateUpdatedIterator, error) + + WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientPreFundingStateUpdated) (event.Subscription, error) + + ParsePreFundingStateUpdated(log types.Log) (*CCIPClientPreFundingStateUpdated, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go index 69bd9bf4af..b869b34798 100644 --- a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go +++ b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go @@ -56,15 +56,15 @@ type ClientEVMTokenAmount struct { } var CCIPClientWithACKMetaData = &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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004acf38038062004acf833981016040819052620000349162000569565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000145565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f0565b505050506200068e565b336001600160a01b038216036200019f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002689190620005a8565b620002749190620005c2565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d091869190620002d616565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000325906001600160a01b038516908490620003ac565b805190915015620003a75780806020019051810190620003469190620005ea565b620003a75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003bd8484600085620003c5565b949350505050565b606082471015620004285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044691906200063b565b60006040518083038185875af1925050503d806000811462000485576040519150601f19603f3d011682016040523d82523d6000602084013e6200048a565b606091505b5090925090506200049e87838387620004a9565b979650505050505050565b606083156200051d57825160000362000515576001600160a01b0385163b620005155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003bd565b620003bd8383815115620005345781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000659565b6001600160a01b03811681146200056657600080fd5b50565b600080604083850312156200057d57600080fd5b82516200058a8162000550565b60208401519092506200059d8162000550565b809150509250929050565b600060208284031215620005bb57600080fd5b5051919050565b80820180821115620005e457634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005fd57600080fd5b815180151581146200060e57600080fd5b9392505050565b60005b838110156200063257818101518382015260200162000618565b50506000910152565b600082516200064f81846020870162000615565b9190910192915050565b60208152600082518060208401526200067a81604085016020870162000615565b601f01601f19169190910160400192915050565b614431806200069e6000396000f3fe60806040526004361061016e5760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b44851461046f578063f2fde38b14610490578063ff2deec3146104b057600080fd5b8063c89245d51461040f578063cf6730f81461042f578063e4ca87541461044f57600080fd5b80639fe74e26116100b05780639fe74e26146103a4578063b0f479a1146103c4578063c851cc32146103ef57600080fd5b806385572ffb146103385780638da5cb5b1461035857600080fd5b80636939cd97116101225780636fef519e116101075780636fef519e146102ad57806379ba5097146103035780638462a2b91461031857600080fd5b80636939cd97146102605780636d62d6331461028d57600080fd5b80630e958d6b116101535780630e958d6b146101f057806335f170ef146102105780635e35359e1461023e57600080fd5b806305bfe9821461017a5780630a9094dc146101c057600080fd5b3661017557005b600080fd5b34801561018657600080fd5b506101aa61019536600461311a565b60086020526000908152604090205460ff1681565b6040516101b79190613162565b60405180910390f35b3480156101cc57600080fd5b506101e06101db36600461311a565b6104dd565b60405190151581526020016101b7565b3480156101fc57600080fd5b506101e061020b3660046131b9565b6104f0565b34801561021c57600080fd5b5061023061022b36600461323e565b61053b565b6040516101b79291906132c9565b34801561024a57600080fd5b5061025e610259366004613319565b610667565b005b34801561026c57600080fd5b5061028061027b36600461311a565b61073c565b6040516101b791906133b7565b34801561029957600080fd5b5061025e6102a836600461344b565b610947565b3480156102b957600080fd5b506102f66040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101b7919061347b565b34801561030f57600080fd5b5061025e610b5e565b34801561032457600080fd5b5061025e6103333660046134da565b610c5b565b34801561034457600080fd5b5061025e610353366004613546565b610f9c565b34801561036457600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b3480156103b057600080fd5b5061025e6103bf366004613581565b6111a5565b3480156103d057600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661037f565b3480156103fb57600080fd5b5061025e61040a3660046135c3565b611342565b34801561041b57600080fd5b5061025e61042a3660046135c3565b61140e565b34801561043b57600080fd5b5061025e61044a366004613546565b611582565b34801561045b57600080fd5b5061025e61046a36600461311a565b6118aa565b61048261047d366004613746565b611b78565b6040519081526020016101b7565b34801561049c57600080fd5b5061025e6104ab3660046135c3565b61214f565b3480156104bc57600080fd5b5060075461037f9073ffffffffffffffffffffffffffffffffffffffff1681565b60006104ea600583612163565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061051f9085908590613853565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061055690613863565b80601f016020809104026020016040519081016040528092919081815260200182805461058290613863565b80156105cf5780601f106105a4576101008083540402835291602001916105cf565b820191906000526020600020905b8154815290600101906020018083116105b257829003601f168201915b5050505050908060010180546105e490613863565b80601f016020809104026020016040519081016040528092919081815260200182805461061090613863565b801561065d5780601f106106325761010080835404028352916020019161065d565b820191906000526020600020905b81548152906001019060200180831161064057829003601f168201915b5050505050905082565b61066f61217e565b73ffffffffffffffffffffffffffffffffffffffff83166106af576106aa73ffffffffffffffffffffffffffffffffffffffff831682612201565b6106d0565b6106d073ffffffffffffffffffffffffffffffffffffffff8416838361235b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161072f91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107ab90613863565b80601f01602080910402602001604051908101604052809291908181526020018280546107d790613863565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050505050815260200160038201805461083d90613863565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613863565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109395760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108e4565b505050915250909392505050565b61094f61217e565b61095a600583612163565b610998576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a195760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109c4565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a696002830182613068565b610a77600383016000613068565b610a856004830160006130a2565b50610a93905060058461242f565b5060005b8151811015610b0d57610b0583838381518110610ab657610ab66138b6565b602002602001015160200151848481518110610ad457610ad46138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661235b9092919063ffffffff16565b600101610a97565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161098f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c6361217e565b60005b81811015610df65760036000848484818110610c8457610c846138b6565b9050602002810190610c9691906138e5565b610ca490602081019061323e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610cdb57610cdb6138b6565b9050602002810190610ced91906138e5565b610cfb906020810190613923565b604051610d09929190613853565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d5057610d506138b6565b9050602002810190610d6291906138e5565b610d70906020810190613923565b604051610d7e929190613853565b6040518091039020838383818110610d9857610d986138b6565b9050602002810190610daa91906138e5565b610db890602081019061323e565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c66565b5060005b83811015610f9557600160036000878785818110610e1a57610e1a6138b6565b9050602002810190610e2c91906138e5565b610e3a90602081019061323e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e7157610e716138b6565b9050602002810190610e8391906138e5565b610e91906020810190613923565b604051610e9f929190613853565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610eef57610eef6138b6565b9050602002810190610f0191906138e5565b610f0f906020810190613923565b604051610f1d929190613853565b6040518091039020858583818110610f3757610f376138b6565b9050602002810190610f4991906138e5565b610f5790602081019061323e565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610dfa565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610fef576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161098f565b610fff604082016020830161323e565b67ffffffffffffffff811660009081526003602052604090208054819061102590613863565b905060000361106c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161098f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110a8908690600401613a8a565b600060405180830381600087803b1580156110c257600080fd5b505af19250505080156110d3575060015b611173573d808015611101576040519150601f19603f3d011682016040523d82523d6000602084013e611106565b606091505b506111136005853561243b565b508335600090815260046020526040902084906111308282613e64565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061116590849061347b565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111ad61217e565b60005b818110156111a05760008383838181106111cc576111cc6138b6565b90506020028101906111de9190613f5e565b6111e790613fa0565b9050806020015161125257805167ffffffffffffffff16600090815260036020526040812061121591613068565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611339565b806040015151600003611291576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906112bd9082614051565b50606082015160018201906112d29082614051565b5081604001516040516112e5919061416b565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212846060015160405161132f919061347b565b60405180910390a3505b506001016111b0565b61134a61217e565b73ffffffffffffffffffffffffffffffffffffffff8116611397576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61141661217e565b60075473ffffffffffffffffffffffffffffffffffffffff16156114775761147761145660025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612447565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611524576115246114e460025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6125c9565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146115bb576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115cb604082016020830161323e565b6115d86040830183613923565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061162f92509050613863565b159050806116855750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611670919061416b565b9081526040519081900360200190205460ff16155b156116be57806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161098f919061347b565b60006116cd6060850185613923565b8101906116da919061417d565b90506000816040015160018111156116f4576116f4613133565b0361170857611702846126c7565b50505050565b60018160400151600181111561172057611720613133565b036117025760008082602001518060200190518101906117409190614229565b60408051808201909152601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060209182015282519083012091935091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b2146117d8576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff1660028111156117fd576117fd613133565b03611837576040517f33704b280000000000000000000000000000000000000000000000000000000081526004810182905260240161098f565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b6118b5600582612163565b6118ee576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161098f565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161193590613863565b80601f016020809104026020016040519081016040528092919081815260200182805461196190613863565b80156119ae5780601f10611983576101008083540402835291602001916119ae565b820191906000526020600020905b81548152906001019060200180831161199157829003601f168201915b505050505081526020016003820180546119c790613863565b80601f01602080910402602001604051908101604052809291908181526020018280546119f390613863565b8015611a405780601f10611a1557610100808354040283529160200191611a40565b820191906000526020600020905b815481529060010190602001808311611a2357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611ac35760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611a6e565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b156002830182613068565b611b23600383016000613068565b611b316004830160006130a2565b50611b3f905060058361242f565b50611b4981612a46565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ba190613863565b9050600003611be8576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161098f565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611c1890613863565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4490613863565b8015611c915780601f10611c6657610100808354040283529160200191611c91565b820191906000526020600020905b815481529060010190602001808311611c7457829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611cf290613863565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1e90613863565b8015611d6b5780601f10611d4057610100808354040283529160200191611d6b565b820191906000526020600020905b815481529060010190602001808311611d4e57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611dd2908b9086906004016142aa565b602060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190614377565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615801590611ecc57506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eca9190614377565b105b15611ef657600754611ef69073ffffffffffffffffffffffffffffffffffffffff16333084612ab8565b60005b875181101561204957611f6933308a8481518110611f1957611f196138b6565b6020026020010151602001518b8581518110611f3757611f376138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612ab8909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611f9957611f996138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146120415760025488516120419173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611ff257611ff26138b6565b6020026020010151602001518a8481518110612010576120106138b6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124479092919063ffffffff16565b600101611ef9565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561207c57600061207e565b825b8a856040518463ffffffff1660e01b815260040161209d9291906142aa565b60206040518083038185885af11580156120bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120e09190614377565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b61215761217e565b61216081612b16565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161098f565b565b8047101561226b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161098f565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146122c5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ca565b606091505b50509050806111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161098f565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111a09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612c0b565b60006121778383612d17565b60006121778383612e0a565b8015806124e757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e59190614377565b155b612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161098f565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111a09084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016123ad565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126649190614377565b61266e9190614390565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117029085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016123ad565b60006040518060a001604052808380604001906126e49190613923565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000060208281019190915291519282019261276592873591016143a3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156127df57816020015b60408051808201909152600080825260208201528152602001906001900390816127b85790505b50815260075473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260409182019160039160009161281f9190880190880161323e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461284f90613863565b80601f016020809104026020016040519081016040528092919081815260200182805461287b90613863565b80156128c85780601f1061289d576101008083540402835291602001916128c8565b820191906000526020600020905b8154815290600101906020018083116128ab57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded612905604086016020870161323e565b846040518363ffffffff1660e01b81526004016129239291906142aa565b602060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129649190614377565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561299c57600061299e565b835b6129ae604088016020890161323e565b866040518463ffffffff1660e01b81526004016129cc9291906142aa565b60206040518083038185885af11580156129ea573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a0f9190614377565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b612a4e61217e565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612a8a9084906004016133b7565b600060405180830381600087803b158015612aa457600080fd5b505af1158015610f95573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117029085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016123ad565b3373ffffffffffffffffffffffffffffffffffffffff821603612b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161098f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612c6d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e599092919063ffffffff16565b8051909150156111a05780806020019051810190612c8b91906143c5565b6111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161098f565b60008181526001830160205260408120548015612e00576000612d3b6001836143e2565b8554909150600090612d4f906001906143e2565b9050818114612db4576000866000018281548110612d6f57612d6f6138b6565b9060005260206000200154905080876000018481548110612d9257612d926138b6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612dc557612dc56143f5565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104ea565b60009150506104ea565b6000818152600183016020526040812054612e51575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104ea565b5060006104ea565b6060612e688484600085612e70565b949350505050565b606082471015612f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161098f565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f2b919061416b565b60006040518083038185875af1925050503d8060008114612f68576040519150601f19603f3d011682016040523d82523d6000602084013e612f6d565b606091505b5091509150612f7e87838387612f89565b979650505050505050565b6060831561301f5782516000036130185773ffffffffffffffffffffffffffffffffffffffff85163b613018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161098f565b5081612e68565b612e6883838151156130345781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f919061347b565b50805461307490613863565b6000825580601f10613084575050565b601f01602090049060005260206000209081019061216091906130c3565b508054600082556002029060005260206000209081019061216091906130dc565b5b808211156130d857600081556001016130c4565b5090565b5b808211156130d85780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600060018201556002016130dd565b60006020828403121561312c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061319d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461216057600080fd5b6000806000604084860312156131ce57600080fd5b83356131d9816131a3565b9250602084013567ffffffffffffffff808211156131f657600080fd5b818601915086601f83011261320a57600080fd5b81358181111561321957600080fd5b87602082850101111561322b57600080fd5b6020830194508093505050509250925092565b60006020828403121561325057600080fd5b8135612177816131a3565b60005b8381101561327657818101518382015260200161325e565b50506000910152565b6000815180845261329781602086016020860161325b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006132dc604083018561327f565b82810360208401526132ee818561327f565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461216057600080fd5b60008060006060848603121561332e57600080fd5b8335613339816132f7565b92506020840135613349816132f7565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156133ac578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161336f565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526133f160c084018261327f565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261342d838361327f565b925060808601519150808584030160a0860152506132ee828261335a565b6000806040838503121561345e57600080fd5b823591506020830135613470816132f7565b809150509250929050565b602081526000612177602083018461327f565b60008083601f8401126134a057600080fd5b50813567ffffffffffffffff8111156134b857600080fd5b6020830191508360208260051b85010111156134d357600080fd5b9250929050565b600080600080604085870312156134f057600080fd5b843567ffffffffffffffff8082111561350857600080fd5b6135148883890161348e565b9096509450602087013591508082111561352d57600080fd5b5061353a8782880161348e565b95989497509550505050565b60006020828403121561355857600080fd5b813567ffffffffffffffff81111561356f57600080fd5b820160a0818503121561217757600080fd5b6000806020838503121561359457600080fd5b823567ffffffffffffffff8111156135ab57600080fd5b6135b78582860161348e565b90969095509350505050565b6000602082840312156135d557600080fd5b8135612177816132f7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613632576136326135e0565b60405290565b6040516060810167ffffffffffffffff81118282101715613632576136326135e0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136a2576136a26135e0565b604052919050565b600067ffffffffffffffff8211156136c4576136c46135e0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261370157600080fd5b813561371461370f826136aa565b61365b565b81815284602083860101111561372957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561375b57600080fd5b8335613766816131a3565b925060208481013567ffffffffffffffff8082111561378457600080fd5b818701915087601f83011261379857600080fd5b8135818111156137aa576137aa6135e0565b6137b8848260051b0161365b565b81815260069190911b8301840190848101908a8311156137d757600080fd5b938501935b82851015613823576040858c0312156137f55760008081fd5b6137fd61360f565b8535613808816132f7565b815285870135878201528252604090940193908501906137dc565b96505050604087013592508083111561383b57600080fd5b5050613849868287016136f0565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061387757607f821691505b6020821081036138b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261391957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261395857600080fd5b83018035915067ffffffffffffffff82111561397357600080fd5b6020019150368190038213156134d357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139bd57600080fd5b830160208101925035905067ffffffffffffffff8111156139dd57600080fd5b8036038213156134d357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133ac578135613a58816132f7565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613a45565b602081528135602082015260006020830135613aa5816131a3565b67ffffffffffffffff8082166040850152613ac36040860186613988565b925060a06060860152613ada60c0860184836139ec565b925050613aea6060860186613988565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613b208583856139ec565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613b5957600080fd5b60209288019283019235915083821115613b7257600080fd5b8160061b3603831315613b8457600080fd5b8685030160a0870152612f7e848284613a35565b601f8211156111a0576000816000526020600020601f850160051c81016020861015613bc15750805b601f850160051c820191505b81811015613be057828155600101613bcd565b505050505050565b67ffffffffffffffff831115613c0057613c006135e0565b613c1483613c0e8354613863565b83613b98565b6000601f841160018114613c665760008515613c305750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f95565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613cb55786850135825560209485019460019092019101613c95565b5086821015613cf0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613d3c816132f7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613da257613da26135e0565b805483825580841015613e2f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613de357613de3613d02565b8086168614613df457613df4613d02565b5060008360005260206000208360011b81018760011b820191505b80821015613e2a578282558284830155600282019150613e0f565b505050505b5060008181526020812083915b85811015613be057613e4e8383613d31565b6040929092019160029190910190600101613e3c565b81358155600181016020830135613e7a816131a3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613eba6040860186613923565b93509150613ecc838360028701613be8565b613ed96060860186613923565b93509150613eeb838360038701613be8565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613f2257600080fd5b918401918235915080821115613f3757600080fd5b506020820191508060061b3603821315613f5057600080fd5b611702818360048601613d89565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261391957600080fd5b801515811461216057600080fd5b600060808236031215613fb257600080fd5b6040516080810167ffffffffffffffff8282108183111715613fd657613fd66135e0565b8160405284359150613fe7826131a3565b908252602084013590613ff982613f92565b816020840152604085013591508082111561401357600080fd5b61401f368387016136f0565b6040840152606085013591508082111561403857600080fd5b50614045368286016136f0565b60608301525092915050565b815167ffffffffffffffff81111561406b5761406b6135e0565b61407f816140798454613863565b84613b98565b602080601f8311600181146140d2576000841561409c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613be0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561411f57888601518255948401946001909101908401614100565b508582101561415b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161391981846020870161325b565b60006020828403121561418f57600080fd5b813567ffffffffffffffff808211156141a757600080fd5b90830190606082860312156141bb57600080fd5b6141c3613638565b8235828111156141d257600080fd5b6141de878286016136f0565b8252506020830135828111156141f357600080fd5b6141ff878286016136f0565b602083015250604083013592506002831061421957600080fd5b6040810192909252509392505050565b6000806040838503121561423c57600080fd5b825167ffffffffffffffff81111561425357600080fd5b8301601f8101851361426457600080fd5b805161427261370f826136aa565b81815286602083850101111561428757600080fd5b61429882602083016020860161325b565b60209590950151949694955050505050565b67ffffffffffffffff83168152604060208201526000825160a060408401526142d660e084018261327f565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152614312838361327f565b9250604086015191508085840301608086015261432f838361335a565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061436d828261327f565b9695505050505050565b60006020828403121561438957600080fd5b5051919050565b808201808211156104ea576104ea613d02565b6040815260006143b6604083018561327f565b90508260208301529392505050565b6000602082840312156143d757600080fd5b815161217781613f92565b818103818111156104ea576104ea613d02565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004a4a38038062004a4a833981016040819052620000349162000591565b8282818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000157565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b0382168360001962000202565b50506009805460ff191691151591909117905550620006c09050565b336001600160a01b03821603620001b15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027a9190620005e0565b620002869190620005fa565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002e291869190620002e816565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000337906001600160a01b038516908490620003be565b805190915015620003b9578080602001905181019062000358919062000622565b620003b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003cf8484600085620003d7565b949350505050565b6060824710156200043a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200045891906200066d565b60006040518083038185875af1925050503d806000811462000497576040519150601f19603f3d011682016040523d82523d6000602084013e6200049c565b606091505b509092509050620004b087838387620004bb565b979650505050505050565b606083156200052f57825160000362000527576001600160a01b0385163b620005275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003cf565b620003cf8383815115620005465781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200068b565b6001600160a01b03811681146200057857600080fd5b50565b805180151581146200058c57600080fd5b919050565b600080600060608486031215620005a757600080fd5b8351620005b48162000562565b6020850151909350620005c78162000562565b9150620005d7604085016200057b565b90509250925092565b600060208284031215620005f357600080fd5b5051919050565b808201808211156200061c57634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200063557600080fd5b62000640826200057b565b9392505050565b60005b83811015620006645781810151838201526020016200064a565b50506000910152565b600082516200068181846020870162000647565b9190910192915050565b6020815260008251806020840152620006ac81604085016020870162000647565b601f01601f19169190910160400192915050565b61437a80620006d06000396000f3fe6080604052600436106101845760003560e01c80638da5cb5b116100d6578063cf6730f81161007f578063ec4a9a2611610059578063ec4a9a26146104a4578063f2fde38b146104be578063ff2deec3146104de57600080fd5b8063cf6730f814610451578063e4ca875414610471578063e89b44851461049157600080fd5b8063c25da3fe116100b0578063c25da3fe146103f1578063c851cc3214610411578063c89245d51461043157600080fd5b80638da5cb5b1461035a5780639fe74e26146103a6578063b0f479a1146103c657600080fd5b80636939cd971161013857806379ba50971161011257806379ba5097146103055780638462a2b91461031a57806385572ffb1461033a57600080fd5b80636939cd97146102765780636d62d633146102a35780636fef519e146102c357600080fd5b80630e958d6b116101695780630e958d6b1461020657806335f170ef146102265780635e35359e1461025457600080fd5b806305bfe982146101905780630a9094dc146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab3660046130d3565b60086020526000908152604090205460ff1681565b6040516101cd919061311b565b60405180910390f35b3480156101e257600080fd5b506101f66101f13660046130d3565b61050b565b60405190151581526020016101cd565b34801561021257600080fd5b506101f6610221366004613172565b61051e565b34801561023257600080fd5b506102466102413660046131f7565b610569565b6040516101cd929190613282565b34801561026057600080fd5b5061027461026f3660046132d2565b610695565b005b34801561028257600080fd5b506102966102913660046130d3565b61076a565b6040516101cd9190613370565b3480156102af57600080fd5b506102746102be366004613404565b610975565b3480156102cf57600080fd5b506102f77f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b281565b6040519081526020016101cd565b34801561031157600080fd5b50610274610b8c565b34801561032657600080fd5b50610274610335366004613480565b610c89565b34801561034657600080fd5b506102746103553660046134ec565b610fca565b34801561036657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b3480156103b257600080fd5b506102746103c1366004613527565b6111d3565b3480156103d257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610381565b3480156103fd57600080fd5b5061027461040c366004613577565b611387565b34801561041d57600080fd5b5061027461042c366004613594565b6113f4565b34801561043d57600080fd5b5061027461044c366004613594565b6114c0565b34801561045d57600080fd5b5061027461046c3660046134ec565b611634565b34801561047d57600080fd5b5061027461048c3660046130d3565b611921565b6102f761049f366004613709565b611bef565b3480156104b057600080fd5b506009546101f69060ff1681565b3480156104ca57600080fd5b506102746104d9366004613594565b612111565b3480156104ea57600080fd5b506007546103819073ffffffffffffffffffffffffffffffffffffffff1681565b6000610518600583612125565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061054d9085908590613816565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061058490613826565b80601f01602080910402602001604051908101604052809291908181526020018280546105b090613826565b80156105fd5780601f106105d2576101008083540402835291602001916105fd565b820191906000526020600020905b8154815290600101906020018083116105e057829003601f168201915b50505050509080600101805461061290613826565b80601f016020809104026020016040519081016040528092919081815260200182805461063e90613826565b801561068b5780601f106106605761010080835404028352916020019161068b565b820191906000526020600020905b81548152906001019060200180831161066e57829003601f168201915b5050505050905082565b61069d612140565b73ffffffffffffffffffffffffffffffffffffffff83166106dd576106d873ffffffffffffffffffffffffffffffffffffffff8316826121c3565b6106fe565b6106fe73ffffffffffffffffffffffffffffffffffffffff8416838361231d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161075d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107d990613826565b80601f016020809104026020016040519081016040528092919081815260200182805461080590613826565b80156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b5050505050815260200160038201805461086b90613826565b80601f016020809104026020016040519081016040528092919081815260200182805461089790613826565b80156108e45780601f106108b9576101008083540402835291602001916108e4565b820191906000526020600020905b8154815290600101906020018083116108c757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109675760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610912565b505050915250909392505050565b61097d612140565b610988600583612125565b6109c6576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a475760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109f2565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a976002830182613021565b610aa5600383016000613021565b610ab360048301600061305b565b50610ac190506005846123f1565b5060005b8151811015610b3b57610b3383838381518110610ae457610ae4613879565b602002602001015160200151848481518110610b0257610b02613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661231d9092919063ffffffff16565b600101610ac5565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109bd565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c91612140565b60005b81811015610e245760036000848484818110610cb257610cb2613879565b9050602002810190610cc491906138a8565b610cd29060208101906131f7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d0957610d09613879565b9050602002810190610d1b91906138a8565b610d299060208101906138e6565b604051610d37929190613816565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d7e57610d7e613879565b9050602002810190610d9091906138a8565b610d9e9060208101906138e6565b604051610dac929190613816565b6040518091039020838383818110610dc657610dc6613879565b9050602002810190610dd891906138a8565b610de69060208101906131f7565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c94565b5060005b83811015610fc357600160036000878785818110610e4857610e48613879565b9050602002810190610e5a91906138a8565b610e689060208101906131f7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e9f57610e9f613879565b9050602002810190610eb191906138a8565b610ebf9060208101906138e6565b604051610ecd929190613816565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f1d57610f1d613879565b9050602002810190610f2f91906138a8565b610f3d9060208101906138e6565b604051610f4b929190613816565b6040518091039020858583818110610f6557610f65613879565b9050602002810190610f7791906138a8565b610f859060208101906131f7565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e28565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461101d576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b61102d60408201602083016131f7565b67ffffffffffffffff811660009081526003602052604090208054819061105390613826565b905060000361109a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109bd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110d6908690600401613a4d565b600060405180830381600087803b1580156110f057600080fd5b505af1925050508015611101575060015b6111a1573d80801561112f576040519150601f19603f3d011682016040523d82523d6000602084013e611134565b606091505b50611141600585356123fd565b5083356000908152600460205260409020849061115e8282613e27565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611193908490613f21565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111db612140565b60005b818110156111ce5760008383838181106111fa576111fa613879565b905060200281019061120c9190613f34565b61121590613f68565b9050806020015161128057805167ffffffffffffffff16600090815260036020526040812061124391613021565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261137e565b8060400151516000036112bf576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112ea9082614019565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906113189082614019565b50806040015160405161132b9190614133565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516113759190613f21565b60405180910390a35b506001016111de565b61138f612140565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b9060200160405180910390a150565b6113fc612140565b73ffffffffffffffffffffffffffffffffffffffff8116611449576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6114c8612140565b60075473ffffffffffffffffffffffffffffffffffffffff16156115295761152961150860025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612409565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115d6576115d661159660025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b33301461166d576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167d60408201602083016131f7565b61168a60408301836138e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116e192509050613826565b159050806117375750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117229190614133565b9081526040519081900360200190205460ff16155b1561177057806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109bd9190613f21565b600061177f60608501856138e6565b81019061178c9190614145565b90506000816040015160018111156117a6576117a66130ec565b036117ba576117b484612689565b50505050565b6001816040015160018111156117d2576117d26130ec565b036117b45760008082602001518060200190518101906117f291906141f1565b915091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b2821461184f576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff166002811115611874576118746130ec565b036118ae576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109bd565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b61192c600582612125565b611965576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109bd565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916119ac90613826565b80601f01602080910402602001604051908101604052809291908181526020018280546119d890613826565b8015611a255780601f106119fa57610100808354040283529160200191611a25565b820191906000526020600020905b815481529060010190602001808311611a0857829003601f168201915b50505050508152602001600382018054611a3e90613826565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6a90613826565b8015611ab75780601f10611a8c57610100808354040283529160200191611ab7565b820191906000526020600020905b815481529060010190602001808311611a9a57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611b3a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611ae5565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b8c6002830182613021565b611b9a600383016000613021565b611ba860048301600061305b565b50611bb690506005836123f1565b50611bc0816129ff565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c1890613826565b9050600003611c5f576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109bd565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611c8f90613826565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbb90613826565b8015611d085780601f10611cdd57610100808354040283529160200191611d08565b820191906000526020600020905b815481529060010190602001808311611ceb57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611d6990613826565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9590613826565b8015611de25780601f10611db757610100808354040283529160200191611de2565b820191906000526020600020905b815481529060010190602001808311611dc557829003601f168201915b5050505050815250905060005b8651811015611f3f57611e5f3330898481518110611e0f57611e0f613879565b6020026020010151602001518a8581518110611e2d57611e2d613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a71909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611e8f57611e8f613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611f37576002548751611f379173ffffffffffffffffffffffffffffffffffffffff1690899084908110611ee857611ee8613879565b602002602001015160200151898481518110611f0657611f06613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124099092919063ffffffff16565b600101611def565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611f99908b908690600401614215565b602060405180830381865afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fda91906142e2565b60095490915060ff1661200c5760075461200c9073ffffffffffffffffffffffffffffffffffffffff16333084612a71565b60025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561203e576000612040565b825b8a856040518463ffffffff1660e01b815260040161205f929190614215565b60206040518083038185885af115801561207d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120a291906142e2565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612119612140565b61212281612acf565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109bd565b565b8047101561222d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109bd565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612287576040519150601f19603f3d011682016040523d82523d6000602084013e61228c565b606091505b50509050806111ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109bd565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111ce9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612bc4565b60006121398383612cd0565b60006121398383612dc3565b8015806124a957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a791906142e2565b155b612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109bd565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111ce9084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161236f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262691906142e2565b61263091906142fb565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117b49085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161236f565b60006040518060a001604052808380604001906126a691906138e6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060405160209182019161271e917f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b29187359101918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561279857816020015b60408051808201909152600080825260208201528152602001906001900390816127715790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040918201916003916000916127d8919088019088016131f7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461280890613826565b80601f016020809104026020016040519081016040528092919081815260200182805461283490613826565b80156128815780601f1061285657610100808354040283529160200191612881565b820191906000526020600020905b81548152906001019060200180831161286457829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded6128be60408601602087016131f7565b846040518363ffffffff1660e01b81526004016128dc929190614215565b602060405180830381865afa1580156128f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291d91906142e2565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612955576000612957565b835b61296760408801602089016131f7565b866040518463ffffffff1660e01b8152600401612985929190614215565b60206040518083038185885af11580156129a3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129c891906142e2565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b612a07612140565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612a43908490600401613370565b600060405180830381600087803b158015612a5d57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117b49085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161236f565b3373ffffffffffffffffffffffffffffffffffffffff821603612b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109bd565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612c26826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e129092919063ffffffff16565b8051909150156111ce5780806020019051810190612c44919061430e565b6111ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109bd565b60008181526001830160205260408120548015612db9576000612cf460018361432b565b8554909150600090612d089060019061432b565b9050818114612d6d576000866000018281548110612d2857612d28613879565b9060005260206000200154905080876000018481548110612d4b57612d4b613879565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d7e57612d7e61433e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610518565b6000915050610518565b6000818152600183016020526040812054612e0a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610518565b506000610518565b6060612e218484600085612e29565b949350505050565b606082471015612ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109bd565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ee49190614133565b60006040518083038185875af1925050503d8060008114612f21576040519150601f19603f3d011682016040523d82523d6000602084013e612f26565b606091505b5091509150612f3787838387612f42565b979650505050505050565b60608315612fd8578251600003612fd15773ffffffffffffffffffffffffffffffffffffffff85163b612fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109bd565b5081612e21565b612e218383815115612fed5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd9190613f21565b50805461302d90613826565b6000825580601f1061303d575050565b601f016020900490600052602060002090810190612122919061307c565b50805460008255600202906000526020600020908101906121229190613095565b5b80821115613091576000815560010161307d565b5090565b5b808211156130915780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613096565b6000602082840312156130e557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613156577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461212257600080fd5b60008060006040848603121561318757600080fd5b83356131928161315c565b9250602084013567ffffffffffffffff808211156131af57600080fd5b818601915086601f8301126131c357600080fd5b8135818111156131d257600080fd5b8760208285010111156131e457600080fd5b6020830194508093505050509250925092565b60006020828403121561320957600080fd5b81356121398161315c565b60005b8381101561322f578181015183820152602001613217565b50506000910152565b60008151808452613250816020860160208601613214565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006132956040830185613238565b82810360208401526132a78185613238565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461212257600080fd5b6000806000606084860312156132e757600080fd5b83356132f2816132b0565b92506020840135613302816132b0565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613365578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613328565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526133aa60c0840182613238565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133e68383613238565b925060808601519150808584030160a0860152506132a78282613313565b6000806040838503121561341757600080fd5b823591506020830135613429816132b0565b809150509250929050565b60008083601f84011261344657600080fd5b50813567ffffffffffffffff81111561345e57600080fd5b6020830191508360208260051b850101111561347957600080fd5b9250929050565b6000806000806040858703121561349657600080fd5b843567ffffffffffffffff808211156134ae57600080fd5b6134ba88838901613434565b909650945060208701359150808211156134d357600080fd5b506134e087828801613434565b95989497509550505050565b6000602082840312156134fe57600080fd5b813567ffffffffffffffff81111561351557600080fd5b820160a0818503121561213957600080fd5b6000806020838503121561353a57600080fd5b823567ffffffffffffffff81111561355157600080fd5b61355d85828601613434565b90969095509350505050565b801515811461212257600080fd5b60006020828403121561358957600080fd5b813561213981613569565b6000602082840312156135a657600080fd5b8135612139816132b0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613603576136036135b1565b60405290565b6040516060810167ffffffffffffffff81118282101715613603576136036135b1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613673576136736135b1565b604052919050565b600082601f83011261368c57600080fd5b813567ffffffffffffffff8111156136a6576136a66135b1565b6136d760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161362c565b8181528460208386010111156136ec57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561371e57600080fd5b83356137298161315c565b925060208481013567ffffffffffffffff8082111561374757600080fd5b818701915087601f83011261375b57600080fd5b81358181111561376d5761376d6135b1565b61377b848260051b0161362c565b81815260069190911b8301840190848101908a83111561379a57600080fd5b938501935b828510156137e6576040858c0312156137b85760008081fd5b6137c06135e0565b85356137cb816132b0565b8152858701358782015282526040909401939085019061379f565b9650505060408701359250808311156137fe57600080fd5b505061380c8682870161367b565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061383a57607f821691505b602082108103613873577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126138dc57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261391b57600080fd5b83018035915067ffffffffffffffff82111561393657600080fd5b60200191503681900382131561347957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261398057600080fd5b830160208101925035905067ffffffffffffffff8111156139a057600080fd5b80360382131561347957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613365578135613a1b816132b0565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613a08565b602081528135602082015260006020830135613a688161315c565b67ffffffffffffffff8082166040850152613a86604086018661394b565b925060a06060860152613a9d60c0860184836139af565b925050613aad606086018661394b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613ae38583856139af565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613b1c57600080fd5b60209288019283019235915083821115613b3557600080fd5b8160061b3603831315613b4757600080fd5b8685030160a0870152612f378482846139f8565b601f8211156111ce576000816000526020600020601f850160051c81016020861015613b845750805b601f850160051c820191505b81811015613ba357828155600101613b90565b505050505050565b67ffffffffffffffff831115613bc357613bc36135b1565b613bd783613bd18354613826565b83613b5b565b6000601f841160018114613c295760008515613bf35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fc3565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613c785786850135825560209485019460019092019101613c58565b5086821015613cb3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613cff816132b0565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613d6557613d656135b1565b805483825580841015613df25760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613da657613da6613cc5565b8086168614613db757613db7613cc5565b5060008360005260206000208360011b81018760011b820191505b80821015613ded578282558284830155600282019150613dd2565b505050505b5060008181526020812083915b85811015613ba357613e118383613cf4565b6040929092019160029190910190600101613dff565b81358155600181016020830135613e3d8161315c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613e7d60408601866138e6565b93509150613e8f838360028701613bab565b613e9c60608601866138e6565b93509150613eae838360038701613bab565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613ee557600080fd5b918401918235915080821115613efa57600080fd5b506020820191508060061b3603821315613f1357600080fd5b6117b4818360048601613d4c565b6020815260006121396020830184613238565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126138dc57600080fd5b600060808236031215613f7a57600080fd5b6040516080810167ffffffffffffffff8282108183111715613f9e57613f9e6135b1565b8160405284359150613faf8261315c565b908252602084013590613fc182613569565b8160208401526040850135915080821115613fdb57600080fd5b613fe73683870161367b565b6040840152606085013591508082111561400057600080fd5b5061400d3682860161367b565b60608301525092915050565b815167ffffffffffffffff811115614033576140336135b1565b614047816140418454613826565b84613b5b565b602080601f83116001811461409a57600084156140645750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ba3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140e7578886015182559484019460019091019084016140c8565b508582101561412357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516138dc818460208701613214565b60006020828403121561415757600080fd5b813567ffffffffffffffff8082111561416f57600080fd5b908301906060828603121561418357600080fd5b61418b613609565b82358281111561419a57600080fd5b6141a68782860161367b565b8252506020830135828111156141bb57600080fd5b6141c78782860161367b565b60208301525060408301359250600283106141e157600080fd5b6040810192909252509392505050565b6000806040838503121561420457600080fd5b505080516020909101519092909150565b67ffffffffffffffff83168152604060208201526000825160a0604084015261424160e0840182613238565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261427d8383613238565b9250604086015191508085840301608086015261429a8383613313565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506142d88282613238565b9695505050505050565b6000602082840312156142f457600080fd5b5051919050565b8082018082111561051857610518613cc5565b60006020828403121561432057600080fd5b815161213981613569565b8181038181111561051857610518613cc5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientWithACKABI = CCIPClientWithACKMetaData.ABI var CCIPClientWithACKBin = CCIPClientWithACKMetaData.Bin -func DeployCCIPClientWithACK(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address) (common.Address, *types.Transaction, *CCIPClientWithACK, error) { +func DeployCCIPClientWithACK(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address, usePreFunding bool) (common.Address, *types.Transaction, *CCIPClientWithACK, error) { parsed, err := CCIPClientWithACKMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -73,7 +73,7 @@ func DeployCCIPClientWithACK(auth *bind.TransactOpts, backend bind.ContractBacke return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPClientWithACKBin), backend, router, feeToken) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPClientWithACKBin), backend, router, feeToken, usePreFunding) if err != nil { return common.Address{}, nil, nil, err } @@ -196,25 +196,25 @@ func (_CCIPClientWithACK *CCIPClientWithACKTransactorRaw) Transact(opts *bind.Tr return _CCIPClientWithACK.Contract.contract.Transact(opts, method, params...) } -func (_CCIPClientWithACK *CCIPClientWithACKCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { +func (_CCIPClientWithACK *CCIPClientWithACKCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([32]byte, error) { var out []interface{} err := _CCIPClientWithACK.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { - return *new(string), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(string)).(*string) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -func (_CCIPClientWithACK *CCIPClientWithACKSession) ACKMESSAGEHEADER() (string, error) { +func (_CCIPClientWithACK *CCIPClientWithACKSession) ACKMESSAGEHEADER() ([32]byte, error) { return _CCIPClientWithACK.Contract.ACKMESSAGEHEADER(&_CCIPClientWithACK.CallOpts) } -func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) ACKMESSAGEHEADER() (string, error) { +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) ACKMESSAGEHEADER() ([32]byte, error) { return _CCIPClientWithACK.Contract.ACKMESSAGEHEADER(&_CCIPClientWithACK.CallOpts) } @@ -402,6 +402,28 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SMessageStatus(message return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) } +func (_CCIPClientWithACK *CCIPClientWithACKCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _CCIPClientWithACK.contract.Call(opts, &out, "s_shouldUsePreFunding") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) SShouldUsePreFunding() (bool, error) { + return _CCIPClientWithACK.Contract.SShouldUsePreFunding(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SShouldUsePreFunding() (bool, error) { + return _CCIPClientWithACK.Contract.SShouldUsePreFunding(&_CCIPClientWithACK.CallOpts) +} + func (_CCIPClientWithACK *CCIPClientWithACKTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPClientWithACK.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -522,6 +544,18 @@ func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdateFeeToken(tok return _CCIPClientWithACK.Contract.UpdateFeeToken(&_CCIPClientWithACK.TransactOpts, token) } +func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { + return _CCIPClientWithACK.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdatePreFundingStatus(&_CCIPClientWithACK.TransactOpts, usePreFunding) +} + +func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _CCIPClientWithACK.Contract.UpdatePreFundingStatus(&_CCIPClientWithACK.TransactOpts, usePreFunding) +} + func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _CCIPClientWithACK.contract.Transact(opts, "updateRouter", newRouter) } @@ -2518,6 +2552,123 @@ func (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseOwnershipTransferred(l return event, nil } +type CCIPClientWithACKPreFundingStateUpdatedIterator struct { + Event *CCIPClientWithACKPreFundingStateUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPClientWithACKPreFundingStateUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPClientWithACKPreFundingStateUpdated) + 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(CCIPClientWithACKPreFundingStateUpdated) + 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 *CCIPClientWithACKPreFundingStateUpdatedIterator) Error() error { + return it.fail +} + +func (it *CCIPClientWithACKPreFundingStateUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPClientWithACKPreFundingStateUpdated struct { + UsePreFunding bool + Raw types.Log +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientWithACKPreFundingStateUpdatedIterator, error) { + + logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return &CCIPClientWithACKPreFundingStateUpdatedIterator{contract: _CCIPClientWithACK.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil +} + +func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKPreFundingStateUpdated) (event.Subscription, error) { + + logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPClientWithACKPreFundingStateUpdated) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "PreFundingStateUpdated", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParsePreFundingStateUpdated(log types.Log) (*CCIPClientWithACKPreFundingStateUpdated, error) { + event := new(CCIPClientWithACKPreFundingStateUpdated) + if err := _CCIPClientWithACK.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CCIPClientWithACKTokensWithdrawnByOwnerIterator struct { Event *CCIPClientWithACKTokensWithdrawnByOwner @@ -2692,6 +2843,8 @@ func (_CCIPClientWithACK *CCIPClientWithACK) ParseLog(log types.Log) (generated. return _CCIPClientWithACK.ParseOwnershipTransferRequested(log) case _CCIPClientWithACK.abi.Events["OwnershipTransferred"].ID: return _CCIPClientWithACK.ParseOwnershipTransferred(log) + case _CCIPClientWithACK.abi.Events["PreFundingStateUpdated"].ID: + return _CCIPClientWithACK.ParsePreFundingStateUpdated(log) case _CCIPClientWithACK.abi.Events["TokensWithdrawnByOwner"].ID: return _CCIPClientWithACK.ParseTokensWithdrawnByOwner(log) @@ -2760,6 +2913,10 @@ func (CCIPClientWithACKOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (CCIPClientWithACKPreFundingStateUpdated) Topic() common.Hash { + return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") +} + func (CCIPClientWithACKTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -2769,7 +2926,7 @@ func (_CCIPClientWithACK *CCIPClientWithACK) Address() common.Address { } type CCIPClientWithACKInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) ([32]byte, error) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) @@ -2789,6 +2946,8 @@ type CCIPClientWithACKInterface interface { SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) + SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) + AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) @@ -2809,6 +2968,8 @@ type CCIPClientWithACKInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2905,6 +3066,12 @@ type CCIPClientWithACKInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPClientWithACKOwnershipTransferred, error) + FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientWithACKPreFundingStateUpdatedIterator, error) + + WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKPreFundingStateUpdated) (event.Subscription, error) + + ParsePreFundingStateUpdated(log types.Log) (*CCIPClientWithACKPreFundingStateUpdated, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientWithACKTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go index b0f41f26ed..a5a4c0a1be 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -57,7 +57,7 @@ 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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200308e3803806200308e8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e9080620001fe6000396000f3fe6080604052600436106100f75760003560e01c806385572ffb1161008a578063c851cc3211610059578063c851cc32146102e1578063cf6730f814610301578063e4ca875414610321578063f2fde38b1461034157600080fd5b806385572ffb1461022a5780638da5cb5b1461024a5780639fe74e2614610296578063b0f479a1146102b657600080fd5b80636939cd97116100c65780636939cd97146101a85780636d62d633146101d557806379ba5097146101f55780638462a2b91461020a57600080fd5b80630a9094dc146101035780630e958d6b1461013857806335f170ef146101585780635e35359e1461018657600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004611fc3565b610361565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610123610153366004611ff2565b610374565b34801561016457600080fd5b50610178610173366004612077565b6103bf565b60405161012f929190612102565b34801561019257600080fd5b506101a66101a1366004612152565b6104eb565b005b3480156101b457600080fd5b506101c86101c3366004611fc3565b6105c0565b60405161012f9190612193565b3480156101e157600080fd5b506101a66101f036600461227a565b6107cb565b34801561020157600080fd5b506101a66109e2565b34801561021657600080fd5b506101a66102253660046122f6565b610adf565b34801561023657600080fd5b506101a6610245366004612362565b610e20565b34801561025657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161012f565b3480156102a257600080fd5b506101a66102b136600461239d565b611029565b3480156102c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610271565b3480156102ed57600080fd5b506101a66102fc3660046123df565b6111c6565b34801561030d57600080fd5b506101a661031c366004612362565b611292565b34801561032d57600080fd5b506101a661033c366004611fc3565b6113ce565b34801561034d57600080fd5b506101a661035c3660046123df565b61169c565b600061036e6005836116b0565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103a390859085906123fc565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906103da9061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546104069061240c565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b5050505050908060010180546104689061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546104949061240c565b80156104e15780601f106104b6576101008083540402835291602001916104e1565b820191906000526020600020905b8154815290600101906020018083116104c457829003601f168201915b5050505050905082565b6104f36116cb565b73ffffffffffffffffffffffffffffffffffffffff83166105335761052e73ffffffffffffffffffffffffffffffffffffffff83168261174e565b610554565b61055473ffffffffffffffffffffffffffffffffffffffff841683836118a8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105b391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161062f9061240c565b80601f016020809104026020016040519081016040528092919081815260200182805461065b9061240c565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016003820180546106c19061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed9061240c565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610768565b505050915250909392505050565b6107d36116cb565b6107de6005836116b0565b61081c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561089d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610848565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506108ed6002830182611f11565b6108fb600383016000611f11565b610909600483016000611f4b565b506109179050600584611935565b5060005b8151811015610991576109898383838151811061093a5761093a61245f565b6020026020010151602001518484815181106109585761095861245f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166118a89092919063ffffffff16565b60010161091b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610813565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ae76116cb565b60005b81811015610c7a5760036000848484818110610b0857610b0861245f565b9050602002810190610b1a919061248e565b610b28906020810190612077565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610b5f57610b5f61245f565b9050602002810190610b71919061248e565b610b7f9060208101906124cc565b604051610b8d9291906123fc565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610bd457610bd461245f565b9050602002810190610be6919061248e565b610bf49060208101906124cc565b604051610c029291906123fc565b6040518091039020838383818110610c1c57610c1c61245f565b9050602002810190610c2e919061248e565b610c3c906020810190612077565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610aea565b5060005b83811015610e1957600160036000878785818110610c9e57610c9e61245f565b9050602002810190610cb0919061248e565b610cbe906020810190612077565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610cf557610cf561245f565b9050602002810190610d07919061248e565b610d159060208101906124cc565b604051610d239291906123fc565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610d7357610d7361245f565b9050602002810190610d85919061248e565b610d939060208101906124cc565b604051610da19291906123fc565b6040518091039020858583818110610dbb57610dbb61245f565b9050602002810190610dcd919061248e565b610ddb906020810190612077565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610c7e565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e73576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610813565b610e836040820160208301612077565b67ffffffffffffffff8116600090815260036020526040902080548190610ea99061240c565b9050600003610ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610813565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f2c90869060040161263e565b600060405180830381600087803b158015610f4657600080fd5b505af1925050508015610f57575060015b610ff7573d808015610f85576040519150601f19603f3d011682016040523d82523d6000602084013e610f8a565b606091505b50610f9760058535611941565b50833560009081526004602052604090208490610fb48282612a47565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610fe9908490612b47565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6110316116cb565b60005b818110156110245760008383838181106110505761105061245f565b90506020028101906110629190612b5a565b61106b90612c47565b905080602001516110d657805167ffffffffffffffff16600090815260036020526040812061109991611f11565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26111bd565b806040015151600003611115576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906111419082612cf8565b50606082015160018201906111569082612cf8565b5081604001516040516111699190612e12565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284606001516040516111b39190612b47565b60405180910390a3505b50600101611034565b6111ce6116cb565b73ffffffffffffffffffffffffffffffffffffffff811661121b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146112cb576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112db6040820160208301612077565b6112e860408301836124cc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061133f9250905061240c565b159050806113955750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516113809190612e12565b9081526040519081900360200190205460ff16155b1561102457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108139190612b47565b6113d96005826116b0565b611412576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610813565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916114599061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546114859061240c565b80156114d25780601f106114a7576101008083540402835291602001916114d2565b820191906000526020600020905b8154815290600101906020018083116114b557829003601f168201915b505050505081526020016003820180546114eb9061240c565b80601f01602080910402602001604051908101604052809291908181526020018280546115179061240c565b80156115645780601f1061153957610100808354040283529160200191611564565b820191906000526020600020905b81548152906001019060200180831161154757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115e75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611592565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506116396002830182611f11565b611647600383016000611f11565b611655600483016000611f4b565b506116639050600583611935565b5061166d8161194d565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6116a46116cb565b6116ad816119bf565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610813565b565b804710156117b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610813565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611812576040519150601f19603f3d011682016040523d82523d6000602084013e611817565b606091505b5050905080611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610813565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611024908490611ab4565b60006116c48383611bc0565b60006116c48383611cb3565b6119556116cb565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611991908490600401612193565b600060405180830381600087803b1580156119ab57600080fd5b505af1158015610e19573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610813565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b16826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d029092919063ffffffff16565b8051909150156110245780806020019051810190611b349190612e24565b611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610813565b60008181526001830160205260408120548015611ca9576000611be4600183612e41565b8554909150600090611bf890600190612e41565b9050818114611c5d576000866000018281548110611c1857611c1861245f565b9060005260206000200154905080876000018481548110611c3b57611c3b61245f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c6e57611c6e612e54565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061036e565b600091505061036e565b6000818152600183016020526040812054611cfa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561036e565b50600061036e565b6060611d118484600085611d19565b949350505050565b606082471015611dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610813565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611dd49190612e12565b60006040518083038185875af1925050503d8060008114611e11576040519150601f19603f3d011682016040523d82523d6000602084013e611e16565b606091505b5091509150611e2787838387611e32565b979650505050505050565b60608315611ec8578251600003611ec15773ffffffffffffffffffffffffffffffffffffffff85163b611ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610813565b5081611d11565b611d118383815115611edd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139190612b47565b508054611f1d9061240c565b6000825580601f10611f2d575050565b601f0160209004906000526020600020908101906116ad9190611f6c565b50805460008255600202906000526020600020908101906116ad9190611f85565b5b80821115611f815760008155600101611f6d565b5090565b5b80821115611f815780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201611f86565b600060208284031215611fd557600080fd5b5035919050565b67ffffffffffffffff811681146116ad57600080fd5b60008060006040848603121561200757600080fd5b833561201281611fdc565b9250602084013567ffffffffffffffff8082111561202f57600080fd5b818601915086601f83011261204357600080fd5b81358181111561205257600080fd5b87602082850101111561206457600080fd5b6020830194508093505050509250925092565b60006020828403121561208957600080fd5b81356116c481611fdc565b60005b838110156120af578181015183820152602001612097565b50506000910152565b600081518084526120d0816020860160208601612094565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061211560408301856120b8565b828103602084015261212781856120b8565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146116ad57600080fd5b60008060006060848603121561216757600080fd5b833561217281612130565b9250602084013561218281612130565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a060608601526121d160c08601836120b8565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261220d84836120b8565b608089015188820390920160a089015281518082529186019450600092508501905b8083101561226e578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600192909201919083019061222f565b50979650505050505050565b6000806040838503121561228d57600080fd5b82359150602083013561229f81612130565b809150509250929050565b60008083601f8401126122bc57600080fd5b50813567ffffffffffffffff8111156122d457600080fd5b6020830191508360208260051b85010111156122ef57600080fd5b9250929050565b6000806000806040858703121561230c57600080fd5b843567ffffffffffffffff8082111561232457600080fd5b612330888389016122aa565b9096509450602087013591508082111561234957600080fd5b50612356878288016122aa565b95989497509550505050565b60006020828403121561237457600080fd5b813567ffffffffffffffff81111561238b57600080fd5b820160a081850312156116c457600080fd5b600080602083850312156123b057600080fd5b823567ffffffffffffffff8111156123c757600080fd5b6123d3858286016122aa565b90969095509350505050565b6000602082840312156123f157600080fd5b81356116c481612130565b8183823760009101908152919050565b600181811c9082168061242057607f821691505b602082108103612459577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126124c257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261250157600080fd5b83018035915067ffffffffffffffff82111561251c57600080fd5b6020019150368190038213156122ef57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261256657600080fd5b830160208101925035905067ffffffffffffffff81111561258657600080fd5b8036038213156122ef57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561263357813561260181612130565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016125ee565b509495945050505050565b60208152813560208201526000602083013561265981611fdc565b67ffffffffffffffff80821660408501526126776040860186612531565b925060a0606086015261268e60c086018483612595565b92505061269e6060860186612531565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526126d4858385612595565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261270d57600080fd5b6020928801928301923591508382111561272657600080fd5b8160061b360383131561273857600080fd5b8685030160a0870152611e278482846125de565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611024576000816000526020600020601f850160051c810160208610156127a45750805b601f850160051c820191505b818110156127c3578281556001016127b0565b505050505050565b67ffffffffffffffff8311156127e3576127e361274c565b6127f7836127f1835461240c565b8361277b565b6000601f84116001811461284957600085156128135750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e19565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156128985786850135825560209485019460019092019101612878565b50868210156128d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561291f81612130565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156129855761298561274c565b805483825580841015612a125760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146129c6576129c66128e5565b80861686146129d7576129d76128e5565b5060008360005260206000208360011b81018760011b820191505b80821015612a0d5782825582848301556002820191506129f2565b505050505b5060008181526020812083915b858110156127c357612a318383612914565b6040929092019160029190910190600101612a1f565b81358155600181016020830135612a5d81611fdc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612a9d60408601866124cc565b93509150612aaf8383600287016127cb565b612abc60608601866124cc565b93509150612ace8383600387016127cb565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612b0557600080fd5b918401918235915080821115612b1a57600080fd5b506020820191508060061b3603821315612b3357600080fd5b612b4181836004860161296c565b50505050565b6020815260006116c460208301846120b8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126124c257600080fd5b80151581146116ad57600080fd5b600082601f830112612bad57600080fd5b813567ffffffffffffffff80821115612bc857612bc861274c565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c0e57612c0e61274c565b81604052838152866020858801011115612c2757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808236031215612c5957600080fd5b6040516080810167ffffffffffffffff8282108183111715612c7d57612c7d61274c565b8160405284359150612c8e82611fdc565b908252602084013590612ca082612b8e565b8160208401526040850135915080821115612cba57600080fd5b612cc636838701612b9c565b60408401526060850135915080821115612cdf57600080fd5b50612cec36828601612b9c565b60608301525092915050565b815167ffffffffffffffff811115612d1257612d1261274c565b612d2681612d20845461240c565b8461277b565b602080601f831160018114612d795760008415612d435750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127c3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612dc657888601518255948401946001909101908401612da7565b5085821015612e0257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516124c2818460208701612094565b600060208284031215612e3657600080fd5b81516116c481612b8e565b8181038181111561036e5761036e6128e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b50604051620030a5380380620030a58339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612ea780620001fe6000396000f3fe6080604052600436106100f75760003560e01c806385572ffb1161008a578063c851cc3211610059578063c851cc32146102e1578063cf6730f814610301578063e4ca875414610321578063f2fde38b1461034157600080fd5b806385572ffb1461022a5780638da5cb5b1461024a5780639fe74e2614610296578063b0f479a1146102b657600080fd5b80636939cd97116100c65780636939cd97146101a85780636d62d633146101d557806379ba5097146101f55780638462a2b91461020a57600080fd5b80630a9094dc146101035780630e958d6b1461013857806335f170ef146101585780635e35359e1461018657600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004611fda565b610361565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610123610153366004612009565b610374565b34801561016457600080fd5b5061017861017336600461208e565b6103bf565b60405161012f929190612119565b34801561019257600080fd5b506101a66101a1366004612169565b6104eb565b005b3480156101b457600080fd5b506101c86101c3366004611fda565b6105c0565b60405161012f91906121aa565b3480156101e157600080fd5b506101a66101f0366004612291565b6107cb565b34801561020157600080fd5b506101a66109e2565b34801561021657600080fd5b506101a661022536600461230d565b610adf565b34801561023657600080fd5b506101a6610245366004612379565b610e20565b34801561025657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161012f565b3480156102a257600080fd5b506101a66102b13660046123b4565b611029565b3480156102c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610271565b3480156102ed57600080fd5b506101a66102fc3660046123f6565b6111dd565b34801561030d57600080fd5b506101a661031c366004612379565b6112a9565b34801561032d57600080fd5b506101a661033c366004611fda565b6113e5565b34801561034d57600080fd5b506101a661035c3660046123f6565b6116b3565b600061036e6005836116c7565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103a39085908590612413565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906103da90612423565b80601f016020809104026020016040519081016040528092919081815260200182805461040690612423565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b50505050509080600101805461046890612423565b80601f016020809104026020016040519081016040528092919081815260200182805461049490612423565b80156104e15780601f106104b6576101008083540402835291602001916104e1565b820191906000526020600020905b8154815290600101906020018083116104c457829003601f168201915b5050505050905082565b6104f36116e2565b73ffffffffffffffffffffffffffffffffffffffff83166105335761052e73ffffffffffffffffffffffffffffffffffffffff831682611765565b610554565b61055473ffffffffffffffffffffffffffffffffffffffff841683836118bf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105b391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161062f90612423565b80601f016020809104026020016040519081016040528092919081815260200182805461065b90612423565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016003820180546106c190612423565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612423565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610768565b505050915250909392505050565b6107d36116e2565b6107de6005836116c7565b61081c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561089d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610848565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506108ed6002830182611f28565b6108fb600383016000611f28565b610909600483016000611f62565b50610917905060058461194c565b5060005b8151811015610991576109898383838151811061093a5761093a612476565b60200260200101516020015184848151811061095857610958612476565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166118bf9092919063ffffffff16565b60010161091b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610813565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ae76116e2565b60005b81811015610c7a5760036000848484818110610b0857610b08612476565b9050602002810190610b1a91906124a5565b610b2890602081019061208e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610b5f57610b5f612476565b9050602002810190610b7191906124a5565b610b7f9060208101906124e3565b604051610b8d929190612413565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610bd457610bd4612476565b9050602002810190610be691906124a5565b610bf49060208101906124e3565b604051610c02929190612413565b6040518091039020838383818110610c1c57610c1c612476565b9050602002810190610c2e91906124a5565b610c3c90602081019061208e565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610aea565b5060005b83811015610e1957600160036000878785818110610c9e57610c9e612476565b9050602002810190610cb091906124a5565b610cbe90602081019061208e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610cf557610cf5612476565b9050602002810190610d0791906124a5565b610d159060208101906124e3565b604051610d23929190612413565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610d7357610d73612476565b9050602002810190610d8591906124a5565b610d939060208101906124e3565b604051610da1929190612413565b6040518091039020858583818110610dbb57610dbb612476565b9050602002810190610dcd91906124a5565b610ddb90602081019061208e565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610c7e565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e73576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610813565b610e83604082016020830161208e565b67ffffffffffffffff8116600090815260036020526040902080548190610ea990612423565b9050600003610ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610813565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f2c908690600401612655565b600060405180830381600087803b158015610f4657600080fd5b505af1925050508015610f57575060015b610ff7573d808015610f85576040519150601f19603f3d011682016040523d82523d6000602084013e610f8a565b606091505b50610f9760058535611958565b50833560009081526004602052604090208490610fb48282612a5e565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610fe9908490612b5e565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6110316116e2565b60005b8181101561102457600083838381811061105057611050612476565b90506020028101906110629190612b71565b61106b90612c5e565b905080602001516110d657805167ffffffffffffffff16600090815260036020526040812061109991611f28565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26111d4565b806040015151600003611115576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906111409082612d0f565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061116e9082612d0f565b5080604001516040516111819190612e29565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516111cb9190612b5e565b60405180910390a35b50600101611034565b6111e56116e2565b73ffffffffffffffffffffffffffffffffffffffff8116611232576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146112e2576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112f2604082016020830161208e565b6112ff60408301836124e3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061135692509050612423565b159050806113ac5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516113979190612e29565b9081526040519081900360200190205460ff16155b1561102457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108139190612b5e565b6113f06005826116c7565b611429576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610813565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161147090612423565b80601f016020809104026020016040519081016040528092919081815260200182805461149c90612423565b80156114e95780601f106114be576101008083540402835291602001916114e9565b820191906000526020600020905b8154815290600101906020018083116114cc57829003601f168201915b5050505050815260200160038201805461150290612423565b80601f016020809104026020016040519081016040528092919081815260200182805461152e90612423565b801561157b5780601f106115505761010080835404028352916020019161157b565b820191906000526020600020905b81548152906001019060200180831161155e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115fe5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016115a9565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506116506002830182611f28565b61165e600383016000611f28565b61166c600483016000611f62565b5061167a905060058361194c565b5061168481611964565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6116bb6116e2565b6116c4816119d6565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610813565b565b804710156117cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610813565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611829576040519150601f19603f3d011682016040523d82523d6000602084013e61182e565b606091505b5050905080611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610813565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611024908490611acb565b60006116db8383611bd7565b60006116db8383611cca565b61196c6116e2565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906119a89084906004016121aa565b600060405180830381600087803b1580156119c257600080fd5b505af1158015610e19573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610813565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b2d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d199092919063ffffffff16565b8051909150156110245780806020019051810190611b4b9190612e3b565b611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610813565b60008181526001830160205260408120548015611cc0576000611bfb600183612e58565b8554909150600090611c0f90600190612e58565b9050818114611c74576000866000018281548110611c2f57611c2f612476565b9060005260206000200154905080876000018481548110611c5257611c52612476565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c8557611c85612e6b565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061036e565b600091505061036e565b6000818152600183016020526040812054611d115750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561036e565b50600061036e565b6060611d288484600085611d30565b949350505050565b606082471015611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610813565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611deb9190612e29565b60006040518083038185875af1925050503d8060008114611e28576040519150601f19603f3d011682016040523d82523d6000602084013e611e2d565b606091505b5091509150611e3e87838387611e49565b979650505050505050565b60608315611edf578251600003611ed85773ffffffffffffffffffffffffffffffffffffffff85163b611ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610813565b5081611d28565b611d288383815115611ef45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139190612b5e565b508054611f3490612423565b6000825580601f10611f44575050565b601f0160209004906000526020600020908101906116c49190611f83565b50805460008255600202906000526020600020908101906116c49190611f9c565b5b80821115611f985760008155600101611f84565b5090565b5b80821115611f985780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201611f9d565b600060208284031215611fec57600080fd5b5035919050565b67ffffffffffffffff811681146116c457600080fd5b60008060006040848603121561201e57600080fd5b833561202981611ff3565b9250602084013567ffffffffffffffff8082111561204657600080fd5b818601915086601f83011261205a57600080fd5b81358181111561206957600080fd5b87602082850101111561207b57600080fd5b6020830194508093505050509250925092565b6000602082840312156120a057600080fd5b81356116db81611ff3565b60005b838110156120c65781810151838201526020016120ae565b50506000910152565b600081518084526120e78160208601602086016120ab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061212c60408301856120cf565b828103602084015261213e81856120cf565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146116c457600080fd5b60008060006060848603121561217e57600080fd5b833561218981612147565b9250602084013561219981612147565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a060608601526121e860c08601836120cf565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261222484836120cf565b608089015188820390920160a089015281518082529186019450600092508501905b80831015612285578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190612246565b50979650505050505050565b600080604083850312156122a457600080fd5b8235915060208301356122b681612147565b809150509250929050565b60008083601f8401126122d357600080fd5b50813567ffffffffffffffff8111156122eb57600080fd5b6020830191508360208260051b850101111561230657600080fd5b9250929050565b6000806000806040858703121561232357600080fd5b843567ffffffffffffffff8082111561233b57600080fd5b612347888389016122c1565b9096509450602087013591508082111561236057600080fd5b5061236d878288016122c1565b95989497509550505050565b60006020828403121561238b57600080fd5b813567ffffffffffffffff8111156123a257600080fd5b820160a081850312156116db57600080fd5b600080602083850312156123c757600080fd5b823567ffffffffffffffff8111156123de57600080fd5b6123ea858286016122c1565b90969095509350505050565b60006020828403121561240857600080fd5b81356116db81612147565b8183823760009101908152919050565b600181811c9082168061243757607f821691505b602082108103612470577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126124d957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261251857600080fd5b83018035915067ffffffffffffffff82111561253357600080fd5b60200191503681900382131561230657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261257d57600080fd5b830160208101925035905067ffffffffffffffff81111561259d57600080fd5b80360382131561230657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561264a57813561261881612147565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612605565b509495945050505050565b60208152813560208201526000602083013561267081611ff3565b67ffffffffffffffff808216604085015261268e6040860186612548565b925060a060608601526126a560c0860184836125ac565b9250506126b56060860186612548565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526126eb8583856125ac565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261272457600080fd5b6020928801928301923591508382111561273d57600080fd5b8160061b360383131561274f57600080fd5b8685030160a0870152611e3e8482846125f5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611024576000816000526020600020601f850160051c810160208610156127bb5750805b601f850160051c820191505b818110156127da578281556001016127c7565b505050505050565b67ffffffffffffffff8311156127fa576127fa612763565b61280e836128088354612423565b83612792565b6000601f841160018114612860576000851561282a5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e19565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156128af578685013582556020948501946001909201910161288f565b50868210156128ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561293681612147565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561299c5761299c612763565b805483825580841015612a295760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146129dd576129dd6128fc565b80861686146129ee576129ee6128fc565b5060008360005260206000208360011b81018760011b820191505b80821015612a24578282558284830155600282019150612a09565b505050505b5060008181526020812083915b858110156127da57612a48838361292b565b6040929092019160029190910190600101612a36565b81358155600181016020830135612a7481611ff3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612ab460408601866124e3565b93509150612ac68383600287016127e2565b612ad360608601866124e3565b93509150612ae58383600387016127e2565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612b1c57600080fd5b918401918235915080821115612b3157600080fd5b506020820191508060061b3603821315612b4a57600080fd5b612b58818360048601612983565b50505050565b6020815260006116db60208301846120cf565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126124d957600080fd5b80151581146116c457600080fd5b600082601f830112612bc457600080fd5b813567ffffffffffffffff80821115612bdf57612bdf612763565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c2557612c25612763565b81604052838152866020858801011115612c3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808236031215612c7057600080fd5b6040516080810167ffffffffffffffff8282108183111715612c9457612c94612763565b8160405284359150612ca582611ff3565b908252602084013590612cb782612ba5565b8160208401526040850135915080821115612cd157600080fd5b612cdd36838701612bb3565b60408401526060850135915080821115612cf657600080fd5b50612d0336828601612bb3565b60608301525092915050565b815167ffffffffffffffff811115612d2957612d29612763565b612d3d81612d378454612423565b84612792565b602080601f831160018114612d905760008415612d5a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127da565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612ddd57888601518255948401946001909101908401612dbe565b5085821015612e1957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516124d98184602087016120ab565b600060208284031215612e4d57600080fd5b81516116db81612ba5565b8181038181111561036e5761036e6128fc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index 2811c796a5..b0bb4c49f5 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -49,7 +49,7 @@ type ClientEVMTokenAmount struct { var CCIPSenderMetaData = &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\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162002547380380620025478339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61234980620001fe6000396000f3fe6080604052600436106100c05760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc321461021d578063effde2401461023d578063f2fde38b1461025e57600080fd5b80638da5cb5b146101865780639fe74e26146101d2578063b0f479a1146101f257600080fd5b80635e35359e116100a55780635e35359e1461012f57806379ba5097146101515780638462a2b91461016657600080fd5b80630e958d6b146100cc57806335f170ef1461010157600080fd5b366100c757005b600080fd5b3480156100d857600080fd5b506100ec6100e73660046118f9565b61027e565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b5061012161011c36600461197c565b6102c9565b6040516100f8929190611a0c565b34801561013b57600080fd5b5061014f61014a366004611a5e565b6103f5565b005b34801561015d57600080fd5b5061014f6104ca565b34801561017257600080fd5b5061014f610181366004611ae6565b6105cc565b34801561019257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b3480156101de57600080fd5b5061014f6101ed366004611b52565b61090d565b3480156101fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101ad565b34801561022957600080fd5b5061014f610238366004611b94565b610aaf565b61025061024b366004611ce4565b610b7b565b6040519081526020016100f8565b34801561026a57600080fd5b5061014f610279366004611b94565b611057565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102ad9085908590611dfe565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906102e490611e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461031090611e0e565b801561035d5780601f106103325761010080835404028352916020019161035d565b820191906000526020600020905b81548152906001019060200180831161034057829003601f168201915b50505050509080600101805461037290611e0e565b80601f016020809104026020016040519081016040528092919081815260200182805461039e90611e0e565b80156103eb5780601f106103c0576101008083540402835291602001916103eb565b820191906000526020600020905b8154815290600101906020018083116103ce57829003601f168201915b5050505050905082565b6103fd61106b565b73ffffffffffffffffffffffffffffffffffffffff831661043d5761043873ffffffffffffffffffffffffffffffffffffffff8316826110ee565b61045e565b61045e73ffffffffffffffffffffffffffffffffffffffff84168383611248565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516104bd91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105d461106b565b60005b8181101561076757600360008484848181106105f5576105f5611e61565b90506020028101906106079190611e90565b61061590602081019061197c565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061064c5761064c611e61565b905060200281019061065e9190611e90565b61066c906020810190611ece565b60405161067a929190611dfe565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106106c1576106c1611e61565b90506020028101906106d39190611e90565b6106e1906020810190611ece565b6040516106ef929190611dfe565b604051809103902083838381811061070957610709611e61565b905060200281019061071b9190611e90565b61072990602081019061197c565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016105d7565b5060005b838110156109065760016003600087878581811061078b5761078b611e61565b905060200281019061079d9190611e90565b6107ab90602081019061197c565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106107e2576107e2611e61565b90506020028101906107f49190611e90565b610802906020810190611ece565b604051610810929190611dfe565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061086057610860611e61565b90506020028101906108729190611e90565b610880906020810190611ece565b60405161088e929190611dfe565b60405180910390208585838181106108a8576108a8611e61565b90506020028101906108ba9190611e90565b6108c890602081019061197c565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161076b565b5050505050565b61091561106b565b60005b81811015610aaa57600083838381811061093457610934611e61565b90506020028101906109469190611f33565b61094f90611f75565b905080602001516109ba57805167ffffffffffffffff16600090815260036020526040812061097d9161188e565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2610aa1565b8060400151516000036109f9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff1660009081526003602052604090819020908201518190610a259082612072565b5060608201516001820190610a3a9082612072565b508160400151604051610a4d919061218c565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128460600151604051610a97919061219e565b60405180910390a3505b50600101610918565b505050565b610ab761106b565b73ffffffffffffffffffffffffffffffffffffffff8116610b04576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff8416600090815260036020526040812080548691908190610ba490611e0e565b9050600003610beb576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610547565b6040805160a08101825267ffffffffffffffff8916600090815260036020529182208054829190610c1b90611e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4790611e0e565b8015610c945780601f10610c6957610100808354040283529160200191610c94565b820191906000526020600020905b815481529060010190602001808311610c7757829003601f168201915b505050505081526020018781526020018881526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610cfb90611e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2790611e0e565b8015610d745780601f10610d4957610100808354040283529160200191610d74565b820191906000526020600020905b815481529060010190602001808311610d5757829003601f168201915b5050505050815250905060005b8751811015610e7a57610df133308a8481518110610da157610da1611e61565b6020026020010151602001518b8581518110610dbf57610dbf611e61565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661131c909392919063ffffffff16565b6002548851610e729173ffffffffffffffffffffffffffffffffffffffff16908a9084908110610e2357610e23611e61565b6020026020010151602001518a8481518110610e4157610e41611e61565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166113809092919063ffffffff16565b600101610d81565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90610ed4908c9086906004016121b1565b602060405180830381865afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906122c6565b905073ffffffffffffffffffffffffffffffffffffffff861615610f7c57610f5573ffffffffffffffffffffffffffffffffffffffff871633308461131c565b600254610f7c9073ffffffffffffffffffffffffffffffffffffffff888116911683611380565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f990881615610fac576000610fae565b825b8b856040518463ffffffff1660e01b8152600401610fcd9291906121b1565b60206040518083038185885af1158015610feb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061101091906122c6565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161104391815260200190565b60405180910390a150505050949350505050565b61105f61106b565b6110688161147e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610547565b565b80471015611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610547565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b5050905080610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610547565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aaa9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611573565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261137a9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161129a565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156113f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141b91906122c6565b61142591906122df565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061137a9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161129a565b3373ffffffffffffffffffffffffffffffffffffffff8216036114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610547565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006115d5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661167f9092919063ffffffff16565b805190915015610aaa57808060200190518101906115f3919061231f565b610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610547565b606061168e8484600085611696565b949350505050565b606082471015611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610547565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611751919061218c565b60006040518083038185875af1925050503d806000811461178e576040519150601f19603f3d011682016040523d82523d6000602084013e611793565b606091505b50915091506117a4878383876117af565b979650505050505050565b6060831561184557825160000361183e5773ffffffffffffffffffffffffffffffffffffffff85163b61183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610547565b508161168e565b61168e838381511561185a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610547919061219e565b50805461189a90611e0e565b6000825580601f106118aa575050565b601f01602090049060005260206000209081019061106891905b808211156118d857600081556001016118c4565b5090565b803567ffffffffffffffff811681146118f457600080fd5b919050565b60008060006040848603121561190e57600080fd5b611917846118dc565b9250602084013567ffffffffffffffff8082111561193457600080fd5b818601915086601f83011261194857600080fd5b81358181111561195757600080fd5b87602082850101111561196957600080fd5b6020830194508093505050509250925092565b60006020828403121561198e57600080fd5b611997826118dc565b9392505050565b60005b838110156119b95781810151838201526020016119a1565b50506000910152565b600081518084526119da81602086016020860161199e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a1f60408301856119c2565b8281036020840152611a3181856119c2565b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146118f457600080fd5b600080600060608486031215611a7357600080fd5b611a7c84611a3a565b9250611a8a60208501611a3a565b9150604084013590509250925092565b60008083601f840112611aac57600080fd5b50813567ffffffffffffffff811115611ac457600080fd5b6020830191508360208260051b8501011115611adf57600080fd5b9250929050565b60008060008060408587031215611afc57600080fd5b843567ffffffffffffffff80821115611b1457600080fd5b611b2088838901611a9a565b90965094506020870135915080821115611b3957600080fd5b50611b4687828801611a9a565b95989497509550505050565b60008060208385031215611b6557600080fd5b823567ffffffffffffffff811115611b7c57600080fd5b611b8885828601611a9a565b90969095509350505050565b600060208284031215611ba657600080fd5b61199782611a3a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c0157611c01611baf565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c4e57611c4e611baf565b604052919050565b600082601f830112611c6757600080fd5b813567ffffffffffffffff811115611c8157611c81611baf565b611cb260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c07565b818152846020838601011115611cc757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611cfa57600080fd5b611d03856118dc565b935060208086013567ffffffffffffffff80821115611d2157600080fd5b818801915088601f830112611d3557600080fd5b813581811115611d4757611d47611baf565b611d55848260051b01611c07565b81815260069190911b8301840190848101908b831115611d7457600080fd5b938501935b82851015611dbe576040858d031215611d925760008081fd5b611d9a611bde565b611da386611a3a565b81528587013587820152825260409094019390850190611d79565b975050506040880135925080831115611dd657600080fd5b5050611de487828801611c56565b925050611df360608601611a3a565b905092959194509250565b8183823760009101908152919050565b600181811c90821680611e2257607f821691505b602082108103611e5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611ec457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f0357600080fd5b83018035915067ffffffffffffffff821115611f1e57600080fd5b602001915036819003821315611adf57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611ec457600080fd5b801515811461106857600080fd5b600060808236031215611f8757600080fd5b6040516080810167ffffffffffffffff8282108183111715611fab57611fab611baf565b81604052611fb8856118dc565b835260208501359150611fca82611f67565b8160208401526040850135915080821115611fe457600080fd5b611ff036838701611c56565b6040840152606085013591508082111561200957600080fd5b5061201636828601611c56565b60608301525092915050565b601f821115610aaa576000816000526020600020601f850160051c8101602086101561204b5750805b601f850160051c820191505b8181101561206a57828155600101612057565b505050505050565b815167ffffffffffffffff81111561208c5761208c611baf565b6120a08161209a8454611e0e565b84612022565b602080601f8311600181146120f357600084156120bd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561206a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561214057888601518255948401946001909101908401612121565b508582101561217c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611ec481846020870161199e565b60208152600061199760208301846119c2565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526121e060e08601826119c2565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261221b83836119c2565b6040890151888203830160808a01528051808352908601945060009350908501905b8084101561227c578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600193909301929086019061223d565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506122b881876119c2565b9a9950505050505050505050565b6000602082840312156122d857600080fd5b5051919050565b80820180821115612319577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561233157600080fd5b815161199781611f6756fea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b506040516200255e3803806200255e8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61236080620001fe6000396000f3fe6080604052600436106100c05760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc321461021d578063effde2401461023d578063f2fde38b1461025e57600080fd5b80638da5cb5b146101865780639fe74e26146101d2578063b0f479a1146101f257600080fd5b80635e35359e116100a55780635e35359e1461012f57806379ba5097146101515780638462a2b91461016657600080fd5b80630e958d6b146100cc57806335f170ef1461010157600080fd5b366100c757005b600080fd5b3480156100d857600080fd5b506100ec6100e7366004611910565b61027e565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b5061012161011c366004611993565b6102c9565b6040516100f8929190611a23565b34801561013b57600080fd5b5061014f61014a366004611a75565b6103f5565b005b34801561015d57600080fd5b5061014f6104ca565b34801561017257600080fd5b5061014f610181366004611afd565b6105cc565b34801561019257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b3480156101de57600080fd5b5061014f6101ed366004611b69565b61090d565b3480156101fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101ad565b34801561022957600080fd5b5061014f610238366004611bab565b610ac6565b61025061024b366004611cfb565b610b92565b6040519081526020016100f8565b34801561026a57600080fd5b5061014f610279366004611bab565b61106e565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102ad9085908590611e15565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906102e490611e25565b80601f016020809104026020016040519081016040528092919081815260200182805461031090611e25565b801561035d5780601f106103325761010080835404028352916020019161035d565b820191906000526020600020905b81548152906001019060200180831161034057829003601f168201915b50505050509080600101805461037290611e25565b80601f016020809104026020016040519081016040528092919081815260200182805461039e90611e25565b80156103eb5780601f106103c0576101008083540402835291602001916103eb565b820191906000526020600020905b8154815290600101906020018083116103ce57829003601f168201915b5050505050905082565b6103fd611082565b73ffffffffffffffffffffffffffffffffffffffff831661043d5761043873ffffffffffffffffffffffffffffffffffffffff831682611105565b61045e565b61045e73ffffffffffffffffffffffffffffffffffffffff8416838361125f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516104bd91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105d4611082565b60005b8181101561076757600360008484848181106105f5576105f5611e78565b90506020028101906106079190611ea7565b610615906020810190611993565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061064c5761064c611e78565b905060200281019061065e9190611ea7565b61066c906020810190611ee5565b60405161067a929190611e15565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106106c1576106c1611e78565b90506020028101906106d39190611ea7565b6106e1906020810190611ee5565b6040516106ef929190611e15565b604051809103902083838381811061070957610709611e78565b905060200281019061071b9190611ea7565b610729906020810190611993565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016105d7565b5060005b838110156109065760016003600087878581811061078b5761078b611e78565b905060200281019061079d9190611ea7565b6107ab906020810190611993565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106107e2576107e2611e78565b90506020028101906107f49190611ea7565b610802906020810190611ee5565b604051610810929190611e15565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061086057610860611e78565b90506020028101906108729190611ea7565b610880906020810190611ee5565b60405161088e929190611e15565b60405180910390208585838181106108a8576108a8611e78565b90506020028101906108ba9190611ea7565b6108c8906020810190611993565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161076b565b5050505050565b610915611082565b60005b81811015610ac157600083838381811061093457610934611e78565b90506020028101906109469190611f4a565b61094f90611f8c565b905080602001516109ba57805167ffffffffffffffff16600090815260036020526040812061097d916118a5565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2610ab8565b8060400151516000036109f9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff16600090815260036020529190912090610a249082612089565b506060810151815167ffffffffffffffff16600090815260036020526040902060010190610a529082612089565b508060400151604051610a6591906121a3565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128360600151604051610aaf91906121b5565b60405180910390a35b50600101610918565b505050565b610ace611082565b73ffffffffffffffffffffffffffffffffffffffff8116610b1b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff8416600090815260036020526040812080548691908190610bbb90611e25565b9050600003610c02576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610547565b6040805160a08101825267ffffffffffffffff8916600090815260036020529182208054829190610c3290611e25565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e90611e25565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b505050505081526020018781526020018881526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610d1290611e25565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3e90611e25565b8015610d8b5780601f10610d6057610100808354040283529160200191610d8b565b820191906000526020600020905b815481529060010190602001808311610d6e57829003601f168201915b5050505050815250905060005b8751811015610e9157610e0833308a8481518110610db857610db8611e78565b6020026020010151602001518b8581518110610dd657610dd6611e78565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611333909392919063ffffffff16565b6002548851610e899173ffffffffffffffffffffffffffffffffffffffff16908a9084908110610e3a57610e3a611e78565b6020026020010151602001518a8481518110610e5857610e58611e78565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166113979092919063ffffffff16565b600101610d98565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90610eeb908c9086906004016121c8565b602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906122dd565b905073ffffffffffffffffffffffffffffffffffffffff861615610f9357610f6c73ffffffffffffffffffffffffffffffffffffffff8716333084611333565b600254610f939073ffffffffffffffffffffffffffffffffffffffff888116911683611397565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f990881615610fc3576000610fc5565b825b8b856040518463ffffffff1660e01b8152600401610fe49291906121c8565b60206040518083038185885af1158015611002573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061102791906122dd565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161105a91815260200190565b60405180910390a150505050949350505050565b611076611082565b61107f81611495565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610547565b565b8047101561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610547565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146111c9576040519150601f19603f3d011682016040523d82523d6000602084013e6111ce565b606091505b5050905080610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610547565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ac19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261158a565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526113919085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112b1565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143291906122dd565b61143c91906122f6565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506113919085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016112b1565b3373ffffffffffffffffffffffffffffffffffffffff821603611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610547565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006115ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166116969092919063ffffffff16565b805190915015610ac1578080602001905181019061160a9190612336565b610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610547565b60606116a584846000856116ad565b949350505050565b60608247101561173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610547565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161176891906121a3565b60006040518083038185875af1925050503d80600081146117a5576040519150601f19603f3d011682016040523d82523d6000602084013e6117aa565b606091505b50915091506117bb878383876117c6565b979650505050505050565b6060831561185c5782516000036118555773ffffffffffffffffffffffffffffffffffffffff85163b611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610547565b50816116a5565b6116a583838151156118715781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054791906121b5565b5080546118b190611e25565b6000825580601f106118c1575050565b601f01602090049060005260206000209081019061107f91905b808211156118ef57600081556001016118db565b5090565b803567ffffffffffffffff8116811461190b57600080fd5b919050565b60008060006040848603121561192557600080fd5b61192e846118f3565b9250602084013567ffffffffffffffff8082111561194b57600080fd5b818601915086601f83011261195f57600080fd5b81358181111561196e57600080fd5b87602082850101111561198057600080fd5b6020830194508093505050509250925092565b6000602082840312156119a557600080fd5b6119ae826118f3565b9392505050565b60005b838110156119d05781810151838201526020016119b8565b50506000910152565b600081518084526119f18160208601602086016119b5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a3660408301856119d9565b8281036020840152611a4881856119d9565b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461190b57600080fd5b600080600060608486031215611a8a57600080fd5b611a9384611a51565b9250611aa160208501611a51565b9150604084013590509250925092565b60008083601f840112611ac357600080fd5b50813567ffffffffffffffff811115611adb57600080fd5b6020830191508360208260051b8501011115611af657600080fd5b9250929050565b60008060008060408587031215611b1357600080fd5b843567ffffffffffffffff80821115611b2b57600080fd5b611b3788838901611ab1565b90965094506020870135915080821115611b5057600080fd5b50611b5d87828801611ab1565b95989497509550505050565b60008060208385031215611b7c57600080fd5b823567ffffffffffffffff811115611b9357600080fd5b611b9f85828601611ab1565b90969095509350505050565b600060208284031215611bbd57600080fd5b6119ae82611a51565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c1857611c18611bc6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c6557611c65611bc6565b604052919050565b600082601f830112611c7e57600080fd5b813567ffffffffffffffff811115611c9857611c98611bc6565b611cc960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c1e565b818152846020838601011115611cde57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611d1157600080fd5b611d1a856118f3565b935060208086013567ffffffffffffffff80821115611d3857600080fd5b818801915088601f830112611d4c57600080fd5b813581811115611d5e57611d5e611bc6565b611d6c848260051b01611c1e565b81815260069190911b8301840190848101908b831115611d8b57600080fd5b938501935b82851015611dd5576040858d031215611da95760008081fd5b611db1611bf5565b611dba86611a51565b81528587013587820152825260409094019390850190611d90565b975050506040880135925080831115611ded57600080fd5b5050611dfb87828801611c6d565b925050611e0a60608601611a51565b905092959194509250565b8183823760009101908152919050565b600181811c90821680611e3957607f821691505b602082108103611e72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611edb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f1a57600080fd5b83018035915067ffffffffffffffff821115611f3557600080fd5b602001915036819003821315611af657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611edb57600080fd5b801515811461107f57600080fd5b600060808236031215611f9e57600080fd5b6040516080810167ffffffffffffffff8282108183111715611fc257611fc2611bc6565b81604052611fcf856118f3565b835260208501359150611fe182611f7e565b8160208401526040850135915080821115611ffb57600080fd5b61200736838701611c6d565b6040840152606085013591508082111561202057600080fd5b5061202d36828601611c6d565b60608301525092915050565b601f821115610ac1576000816000526020600020601f850160051c810160208610156120625750805b601f850160051c820191505b818110156120815782815560010161206e565b505050505050565b815167ffffffffffffffff8111156120a3576120a3611bc6565b6120b7816120b18454611e25565b84612039565b602080601f83116001811461210a57600084156120d45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612081565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561215757888601518255948401946001909101908401612138565b508582101561219357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611edb8184602087016119b5565b6020815260006119ae60208301846119d9565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526121f760e08601826119d9565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261223283836119d9565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612293578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612254565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506122cf81876119d9565b9a9950505050505050505050565b6000602082840312156122ef57600080fd5b5051919050565b80820180821115612330577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561234857600080fd5b81516119ae81611f7e56fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index 92d50f5f6a..20edfc1dc4 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620048ac380380620048ac8339810160408190526200003491620005bd565b8181818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000135565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556007805493861693909116831790556200012b9250600019620001e0565b50505050620006ba565b336001600160a01b038216036200018f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200025e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c9190620005fc565b155b620002d25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000086565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200032a9185916200032f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200037e906001600160a01b03851690849062000400565b8051909150156200032a57808060200190518101906200039f919062000616565b6200032a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b606062000411848460008562000419565b949350505050565b6060824710156200047c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200049a919062000667565b60006040518083038185875af1925050503d8060008114620004d9576040519150601f19603f3d011682016040523d82523d6000602084013e620004de565b606091505b509092509050620004f287838387620004fd565b979650505050505050565b606083156200057157825160000362000569576001600160a01b0385163b620005695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b508162000411565b620004118383815115620005885781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000685565b6001600160a01b0381168114620005ba57600080fd5b50565b60008060408385031215620005d157600080fd5b8251620005de81620005a4565b6020840151909250620005f181620005a4565b809150509250929050565b6000602082840312156200060f57600080fd5b5051919050565b6000602082840312156200062957600080fd5b815180151581146200063a57600080fd5b9392505050565b60005b838110156200065e57818101518382015260200162000644565b50506000910152565b600082516200067b81846020870162000641565b9190910192915050565b6020815260008251806020840152620006a681604085016020870162000641565b601f01601f19169190910160400192915050565b6141e280620006ca6000396000f3fe6080604052600436106101a55760003560e01c80638da5cb5b116100e1578063c851cc321161008a578063e4ca875411610064578063e4ca875414610536578063e89b448514610556578063f2fde38b14610577578063ff2deec31461059757600080fd5b8063c851cc32146104d6578063c89245d5146104f6578063cf6730f81461051657600080fd5b8063b187bd26116100bb578063b187bd261461043b578063b5a110111461046b578063bee518a41461048b57600080fd5b80638da5cb5b146103c55780639fe74e26146103f0578063b0f479a11461041057600080fd5b806335f170ef1161014e5780636d62d633116101285780636d62d6331461035057806379ba5097146103705780638462a2b91461038557806385572ffb146103a557600080fd5b806335f170ef146102d55780635e35359e146103035780636939cd971461032357600080fd5b8063181f5a771161017f578063181f5a77146102285780632874d8bf146102745780632b6e5d631461028957600080fd5b80630a9094dc146101b15780630e958d6b146101e657806316c38b3c1461020657600080fd5b366101ac57005b600080fd5b3480156101bd57600080fd5b506101d16101cc366004613070565b6105c4565b60405190151581526020015b60405180910390f35b3480156101f257600080fd5b506101d161020136600461309f565b6105d7565b34801561021257600080fd5b50610226610221366004613132565b610622565b005b34801561023457600080fd5b50604080518082018252601281527f50696e67506f6e6744656d6f20312e362e300000000000000000000000000000602082015290516101dd91906131bd565b34801561028057600080fd5b50610226610674565b34801561029557600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b3480156102e157600080fd5b506102f56102f03660046131d0565b6106b0565b6040516101dd9291906131ed565b34801561030f57600080fd5b5061022661031e36600461323d565b6107dc565b34801561032f57600080fd5b5061034361033e366004613070565b6108b1565b6040516101dd91906132db565b34801561035c57600080fd5b5061022661036b36600461336f565b610abc565b34801561037c57600080fd5b50610226610cd3565b34801561039157600080fd5b506102266103a03660046133eb565b610dd0565b3480156103b157600080fd5b506102266103c0366004613457565b611111565b3480156103d157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102b0565b3480156103fc57600080fd5b5061022661040b366004613492565b61131a565b34801561041c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102b0565b34801561044757600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101d1565b34801561047757600080fd5b506102266104863660046134d4565b6114b7565b34801561049757600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101dd565b3480156104e257600080fd5b506102266104f1366004613502565b6116bf565b34801561050257600080fd5b50610226610511366004613502565b61178b565b34801561052257600080fd5b50610226610531366004613457565b6118f5565b34801561054257600080fd5b50610226610551366004613070565b611a80565b610569610564366004613654565b611d4e565b6040519081526020016101dd565b34801561058357600080fd5b50610226610592366004613502565b6122fc565b3480156105a357600080fd5b506007546102b09073ffffffffffffffffffffffffffffffffffffffff1681565b60006105d1600583612310565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106069085908590613761565b9081526040519081900360200190205460ff1690509392505050565b61062a61232b565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61067c61232b565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556106ae60016123ac565b565b6003602052600090815260409020805481906106cb90613771565b80601f01602080910402602001604051908101604052809291908181526020018280546106f790613771565b80156107445780601f1061071957610100808354040283529160200191610744565b820191906000526020600020905b81548152906001019060200180831161072757829003601f168201915b50505050509080600101805461075990613771565b80601f016020809104026020016040519081016040528092919081815260200182805461078590613771565b80156107d25780601f106107a7576101008083540402835291602001916107d2565b820191906000526020600020905b8154815290600101906020018083116107b557829003601f168201915b5050505050905082565b6107e461232b565b73ffffffffffffffffffffffffffffffffffffffff83166108245761081f73ffffffffffffffffffffffffffffffffffffffff8316826124d0565b610845565b61084573ffffffffffffffffffffffffffffffffffffffff8416838361262a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516108a491815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161092090613771565b80601f016020809104026020016040519081016040528092919081815260200182805461094c90613771565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b505050505081526020016003820180546109b290613771565b80601f01602080910402602001604051908101604052809291908181526020018280546109de90613771565b8015610a2b5780601f10610a0057610100808354040283529160200191610a2b565b820191906000526020600020905b815481529060010190602001808311610a0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610aae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a59565b505050915250909392505050565b610ac461232b565b610acf600583612310565b610b0d576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610b8e5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b39565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610bde6002830182612fbe565b610bec600383016000612fbe565b610bfa600483016000612ff8565b50610c0890506005846126fe565b5060005b8151811015610c8257610c7a83838381518110610c2b57610c2b6137c4565b602002602001015160200151848481518110610c4957610c496137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661262a9092919063ffffffff16565b600101610c0c565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b04565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610dd861232b565b60005b81811015610f6b5760036000848484818110610df957610df96137c4565b9050602002810190610e0b91906137f3565b610e199060208101906131d0565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e5057610e506137c4565b9050602002810190610e6291906137f3565b610e70906020810190613831565b604051610e7e929190613761565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ec557610ec56137c4565b9050602002810190610ed791906137f3565b610ee5906020810190613831565b604051610ef3929190613761565b6040518091039020838383818110610f0d57610f0d6137c4565b9050602002810190610f1f91906137f3565b610f2d9060208101906131d0565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ddb565b5060005b8381101561110a57600160036000878785818110610f8f57610f8f6137c4565b9050602002810190610fa191906137f3565b610faf9060208101906131d0565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fe657610fe66137c4565b9050602002810190610ff891906137f3565b611006906020810190613831565b604051611014929190613761565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110611064576110646137c4565b905060200281019061107691906137f3565b611084906020810190613831565b604051611092929190613761565b60405180910390208585838181106110ac576110ac6137c4565b90506020028101906110be91906137f3565b6110cc9060208101906131d0565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f6f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611164576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b04565b61117460408201602083016131d0565b67ffffffffffffffff811660009081526003602052604090208054819061119a90613771565b90506000036111e1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b04565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061121d908690600401613998565b600060405180830381600087803b15801561123757600080fd5b505af1925050508015611248575060015b6112e8573d808015611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b506112886005853561270a565b508335600090815260046020526040902084906112a58282613d72565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112da9084906131bd565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61132261232b565b60005b81811015611315576000838383818110611341576113416137c4565b90506020028101906113539190613e6c565b61135c90613ea0565b905080602001516113c757805167ffffffffffffffff16600090815260036020526040812061138a91612fbe565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26114ae565b806040015151600003611406576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906114329082613f51565b50606082015160018201906114479082613f51565b50816040015160405161145a919061406b565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721284606001516040516114a491906131bd565b60405180910390a3505b50600101611325565b6114bf61232b565b73ffffffffffffffffffffffffffffffffffffffff811615806114ea575067ffffffffffffffff8216155b15611521576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526116129161406b565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113159082613f51565b6116c761232b565b73ffffffffffffffffffffffffffffffffffffffff8116611714576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61179361232b565b60075473ffffffffffffffffffffffffffffffffffffffff16156117f4576117f46117d360025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612716565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156118a1576118a161186160025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612898565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461192e576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193e60408201602083016131d0565b61194b6040830183613831565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506119a292509050613771565b159050806119f85750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516119e3919061406b565b9081526040519081900360200190205460ff16155b15611a3157806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b0491906131bd565b60085474010000000000000000000000000000000000000000900460ff1661131557611315611a636060850185613831565b810190611a709190613070565b611a7b90600161407d565b6123ac565b611a8b600582612310565b611ac4576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b04565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b0b90613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3790613771565b8015611b845780601f10611b5957610100808354040283529160200191611b84565b820191906000526020600020905b815481529060010190602001808311611b6757829003601f168201915b50505050508152602001600382018054611b9d90613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc990613771565b8015611c165780601f10611beb57610100808354040283529160200191611c16565b820191906000526020600020905b815481529060010190602001808311611bf957829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611c995760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c44565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611ceb6002830182612fbe565b611cf9600383016000612fbe565b611d07600483016000612ff8565b50611d1590506005836126fe565b50611d1f8161299c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611d7790613771565b9050600003611dbe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b04565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611dee90613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1a90613771565b8015611e675780601f10611e3c57610100808354040283529160200191611e67565b820191906000526020600020905b815481529060010190602001808311611e4a57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ec890613771565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef490613771565b8015611f415780601f10611f1657610100808354040283529160200191611f41565b820191906000526020600020905b815481529060010190602001808311611f2457829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611fa8908b908690600401614090565b602060405180830381865afa158015611fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe9919061415d565b60075490915073ffffffffffffffffffffffffffffffffffffffff16158015906120a257506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561207c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a0919061415d565b105b156120cc576007546120cc9073ffffffffffffffffffffffffffffffffffffffff16333084612a0e565b60005b875181101561221f5761213f33308a84815181106120ef576120ef6137c4565b6020026020010151602001518b858151811061210d5761210d6137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a0e909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061216f5761216f6137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146122175760025488516122179173ffffffffffffffffffffffffffffffffffffffff16908a90849081106121c8576121c86137c4565b6020026020010151602001518a84815181106121e6576121e66137c4565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127169092919063ffffffff16565b6001016120cf565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612252576000612254565b825b8a856040518463ffffffff1660e01b8152600401612273929190614090565b60206040518083038185885af1158015612291573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122b6919061415d565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516122e991815260200190565b60405180910390a1505050509392505050565b61230461232b565b61230d81612a6c565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b04565b806001166001036123ef576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612423565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161243891815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600754600080855260208501909352909350611315927401000000000000000000000000000000000000000090910467ffffffffffffffff16916124c9565b60408051808201909152600080825260208201528152602001906001900390816124a25790505b5083611d4e565b8047101561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b04565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612594576040519150601f19603f3d011682016040523d82523d6000602084013e612599565b606091505b5050905080611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b04565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113159084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b61565b60006123248383612c6d565b60006123248383612d60565b8015806127b657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b4919061415d565b155b612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b04565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113159084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161267c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561290f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612933919061415d565b61293d919061407d565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129969085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161267c565b50505050565b6129a461232b565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906129e09084906004016132db565b600060405180830381600087803b1580156129fa57600080fd5b505af115801561110a573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129969085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161267c565b3373ffffffffffffffffffffffffffffffffffffffff821603612aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b04565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612bc3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612daf9092919063ffffffff16565b8051909150156113155780806020019051810190612be19190614176565b611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b04565b60008181526001830160205260408120548015612d56576000612c91600183614193565b8554909150600090612ca590600190614193565b9050818114612d0a576000866000018281548110612cc557612cc56137c4565b9060005260206000200154905080876000018481548110612ce857612ce86137c4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d1b57612d1b6141a6565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d1565b60009150506105d1565b6000818152600183016020526040812054612da7575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d1565b5060006105d1565b6060612dbe8484600085612dc6565b949350505050565b606082471015612e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b04565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e81919061406b565b60006040518083038185875af1925050503d8060008114612ebe576040519150601f19603f3d011682016040523d82523d6000602084013e612ec3565b606091505b5091509150612ed487838387612edf565b979650505050505050565b60608315612f75578251600003612f6e5773ffffffffffffffffffffffffffffffffffffffff85163b612f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b04565b5081612dbe565b612dbe8383815115612f8a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0491906131bd565b508054612fca90613771565b6000825580601f10612fda575050565b601f01602090049060005260206000209081019061230d9190613019565b508054600082556002029060005260206000209081019061230d9190613032565b5b8082111561302e576000815560010161301a565b5090565b5b8082111561302e5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613033565b60006020828403121561308257600080fd5b5035919050565b67ffffffffffffffff8116811461230d57600080fd5b6000806000604084860312156130b457600080fd5b83356130bf81613089565b9250602084013567ffffffffffffffff808211156130dc57600080fd5b818601915086601f8301126130f057600080fd5b8135818111156130ff57600080fd5b87602082850101111561311157600080fd5b6020830194508093505050509250925092565b801515811461230d57600080fd5b60006020828403121561314457600080fd5b813561232481613124565b60005b8381101561316a578181015183820152602001613152565b50506000910152565b6000815180845261318b81602086016020860161314f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006123246020830184613173565b6000602082840312156131e257600080fd5b813561232481613089565b6040815260006132006040830185613173565b82810360208401526132128185613173565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461230d57600080fd5b60008060006060848603121561325257600080fd5b833561325d8161321b565b9250602084013561326d8161321b565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156132d0578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613293565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261331560c0840182613173565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133518383613173565b925060808601519150808584030160a086015250613212828261327e565b6000806040838503121561338257600080fd5b8235915060208301356133948161321b565b809150509250929050565b60008083601f8401126133b157600080fd5b50813567ffffffffffffffff8111156133c957600080fd5b6020830191508360208260051b85010111156133e457600080fd5b9250929050565b6000806000806040858703121561340157600080fd5b843567ffffffffffffffff8082111561341957600080fd5b6134258883890161339f565b9096509450602087013591508082111561343e57600080fd5b5061344b8782880161339f565b95989497509550505050565b60006020828403121561346957600080fd5b813567ffffffffffffffff81111561348057600080fd5b820160a0818503121561232457600080fd5b600080602083850312156134a557600080fd5b823567ffffffffffffffff8111156134bc57600080fd5b6134c88582860161339f565b90969095509350505050565b600080604083850312156134e757600080fd5b82356134f281613089565b915060208301356133948161321b565b60006020828403121561351457600080fd5b81356123248161321b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156135715761357161351f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135be576135be61351f565b604052919050565b600082601f8301126135d757600080fd5b813567ffffffffffffffff8111156135f1576135f161351f565b61362260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613577565b81815284602083860101111561363757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561366957600080fd5b833561367481613089565b925060208481013567ffffffffffffffff8082111561369257600080fd5b818701915087601f8301126136a657600080fd5b8135818111156136b8576136b861351f565b6136c6848260051b01613577565b81815260069190911b8301840190848101908a8311156136e557600080fd5b938501935b82851015613731576040858c0312156137035760008081fd5b61370b61354e565b85356137168161321b565b815285870135878201528252604090940193908501906136ea565b96505050604087013592508083111561374957600080fd5b5050613757868287016135c6565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061378557607f821691505b6020821081036137be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261382757600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261386657600080fd5b83018035915067ffffffffffffffff82111561388157600080fd5b6020019150368190038213156133e457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138cb57600080fd5b830160208101925035905067ffffffffffffffff8111156138eb57600080fd5b8036038213156133e457600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156132d05781356139668161321b565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613953565b6020815281356020820152600060208301356139b381613089565b67ffffffffffffffff80821660408501526139d16040860186613896565b925060a060608601526139e860c0860184836138fa565b9250506139f86060860186613896565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a2e8583856138fa565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613a6757600080fd5b60209288019283019235915083821115613a8057600080fd5b8160061b3603831315613a9257600080fd5b8685030160a0870152612ed4848284613943565b601f821115611315576000816000526020600020601f850160051c81016020861015613acf5750805b601f850160051c820191505b81811015613aee57828155600101613adb565b505050505050565b67ffffffffffffffff831115613b0e57613b0e61351f565b613b2283613b1c8354613771565b83613aa6565b6000601f841160018114613b745760008515613b3e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561110a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613bc35786850135825560209485019460019092019101613ba3565b5086821015613bfe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c4a8161321b565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613cb057613cb061351f565b805483825580841015613d3d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613cf157613cf1613c10565b8086168614613d0257613d02613c10565b5060008360005260206000208360011b81018760011b820191505b80821015613d38578282558284830155600282019150613d1d565b505050505b5060008181526020812083915b85811015613aee57613d5c8383613c3f565b6040929092019160029190910190600101613d4a565b81358155600181016020830135613d8881613089565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613dc86040860186613831565b93509150613dda838360028701613af6565b613de76060860186613831565b93509150613df9838360038701613af6565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e3057600080fd5b918401918235915080821115613e4557600080fd5b506020820191508060061b3603821315613e5e57600080fd5b612996818360048601613c97565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261382757600080fd5b600060808236031215613eb257600080fd5b6040516080810167ffffffffffffffff8282108183111715613ed657613ed661351f565b8160405284359150613ee782613089565b908252602084013590613ef982613124565b8160208401526040850135915080821115613f1357600080fd5b613f1f368387016135c6565b60408401526060850135915080821115613f3857600080fd5b50613f45368286016135c6565b60608301525092915050565b815167ffffffffffffffff811115613f6b57613f6b61351f565b613f7f81613f798454613771565b84613aa6565b602080601f831160018114613fd25760008415613f9c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613aee565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561401f57888601518255948401946001909101908401614000565b508582101561405b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161382781846020870161314f565b808201808211156105d1576105d1613c10565b67ffffffffffffffff83168152604060208201526000825160a060408401526140bc60e0840182613173565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526140f88383613173565b92506040860151915080858403016080860152614115838361327e565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506141538282613173565b9695505050505050565b60006020828403121561416f57600080fd5b5051919050565b60006020828403121561418857600080fd5b815161232481613124565b818103818111156105d1576105d1613c10565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620049e5380380620049e58339810160408190526200003491620005e8565b8181600182803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000160565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03928316179055600780549185166001600160a81b03199092168217600160a01b85151502179055159050620001555760025460075462000155916001600160a01b0391821691166000196200020b565b5050505050620006e5565b336001600160a01b03821603620001ba5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002895750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000261573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000287919062000627565b155b620002fd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003559185916200035a16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003a9906001600160a01b0385169084906200042b565b805190915015620003555780806020019051810190620003ca919062000641565b620003555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043c848460008562000444565b949350505050565b606082471015620004a75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c5919062000692565b60006040518083038185875af1925050503d806000811462000504576040519150601f19603f3d011682016040523d82523d6000602084013e62000509565b606091505b5090925090506200051d8783838762000528565b979650505050505050565b606083156200059c57825160000362000594576001600160a01b0385163b620005945760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043c565b6200043c8383815115620005b35781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006b0565b6001600160a01b0381168114620005e557600080fd5b50565b60008060408385031215620005fc57600080fd5b82516200060981620005cf565b60208401519092506200061c81620005cf565b809150509250929050565b6000602082840312156200063a57600080fd5b5051919050565b6000602082840312156200065457600080fd5b815180151581146200066557600080fd5b9392505050565b60005b83811015620006895781810151838201526020016200066f565b50506000910152565b60008251620006a68184602087016200066c565b9190910192915050565b6020815260008251806020840152620006d18160408501602087016200066c565b601f01601f19169190910160400192915050565b6142f080620006f56000396000f3fe6080604052600436106101bb5760003560e01c80639fe74e26116100ec578063c89245d51161008a578063e89b448511610064578063e89b44851461058d578063ec4a9a26146105ae578063f2fde38b146105e0578063ff2deec31461060057600080fd5b8063c89245d51461052d578063cf6730f81461054d578063e4ca87541461056d57600080fd5b8063b5a11011116100c6578063b5a1101114610481578063bee518a4146104a1578063c25da3fe146104ed578063c851cc321461050d57600080fd5b80639fe74e2614610406578063b0f479a114610426578063b187bd261461045157600080fd5b80635e35359e1161015957806379ba50971161013357806379ba5097146103865780638462a2b91461039b57806385572ffb146103bb5780638da5cb5b146103db57600080fd5b80635e35359e146103195780636939cd97146103395780636d62d6331461036657600080fd5b8063181f5a7711610195578063181f5a771461023e5780632874d8bf1461028a5780632b6e5d631461029f57806335f170ef146102eb57600080fd5b80630a9094dc146101c75780630e958d6b146101fc57806316c38b3c1461021c57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101e76101e236600461317e565b61062d565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b506101e76102173660046131ad565b610640565b34801561022857600080fd5b5061023c610237366004613240565b61068b565b005b34801561024a57600080fd5b50604080518082018252601681527f50696e67506f6e6744656d6f20312e362e302d64657600000000000000000000602082015290516101f391906132cb565b34801561029657600080fd5b5061023c6106dd565b3480156102ab57600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b3480156102f757600080fd5b5061030b6103063660046132de565b610719565b6040516101f39291906132fb565b34801561032557600080fd5b5061023c61033436600461334b565b610845565b34801561034557600080fd5b5061035961035436600461317e565b61091a565b6040516101f391906133e9565b34801561037257600080fd5b5061023c61038136600461347d565b610b25565b34801561039257600080fd5b5061023c610d3c565b3480156103a757600080fd5b5061023c6103b63660046134f9565b610e39565b3480156103c757600080fd5b5061023c6103d6366004613565565b61117a565b3480156103e757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102c6565b34801561041257600080fd5b5061023c6104213660046135a0565b611383565b34801561043257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102c6565b34801561045d57600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101e7565b34801561048d57600080fd5b5061023c61049c3660046135e2565b611537565b3480156104ad57600080fd5b506007547501000000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101f3565b3480156104f957600080fd5b5061023c610508366004613240565b611740565b34801561051957600080fd5b5061023c610528366004613610565b6117cc565b34801561053957600080fd5b5061023c610548366004613610565b611898565b34801561055957600080fd5b5061023c610568366004613565565b611a02565b34801561057957600080fd5b5061023c61058836600461317e565b611b8d565b6105a061059b366004613762565b611e5b565b6040519081526020016101f3565b3480156105ba57600080fd5b506007546101e79074010000000000000000000000000000000000000000900460ff1681565b3480156105ec57600080fd5b5061023c6105fb366004613610565b612409565b34801561060c57600080fd5b506007546102c69073ffffffffffffffffffffffffffffffffffffffff1681565b600061063a60058361241d565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061066f908590859061386f565b9081526040519081900360200190205460ff1690509392505050565b610693612438565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106e5612438565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905561071760016124b9565b565b6003602052600090815260409020805481906107349061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546107609061387f565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b5050505050908060010180546107c29061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546107ee9061387f565b801561083b5780601f106108105761010080835404028352916020019161083b565b820191906000526020600020905b81548152906001019060200180831161081e57829003601f168201915b5050505050905082565b61084d612438565b73ffffffffffffffffffffffffffffffffffffffff831661088d5761088873ffffffffffffffffffffffffffffffffffffffff8316826125de565b6108ae565b6108ae73ffffffffffffffffffffffffffffffffffffffff84168383612738565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161090d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109899061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546109b59061387f565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b50505050508152602001600382018054610a1b9061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a479061387f565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ac2565b505050915250909392505050565b610b2d612438565b610b3860058361241d565b610b76576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610bf75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ba2565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c4760028301826130cc565b610c556003830160006130cc565b610c63600483016000613106565b50610c71905060058461280c565b5060005b8151811015610ceb57610ce383838381518110610c9457610c946138d2565b602002602001015160200151848481518110610cb257610cb26138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127389092919063ffffffff16565b600101610c75565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b6d565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e41612438565b60005b81811015610fd45760036000848484818110610e6257610e626138d2565b9050602002810190610e749190613901565b610e829060208101906132de565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610eb957610eb96138d2565b9050602002810190610ecb9190613901565b610ed990602081019061393f565b604051610ee792919061386f565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f2e57610f2e6138d2565b9050602002810190610f409190613901565b610f4e90602081019061393f565b604051610f5c92919061386f565b6040518091039020838383818110610f7657610f766138d2565b9050602002810190610f889190613901565b610f969060208101906132de565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e44565b5060005b8381101561117357600160036000878785818110610ff857610ff86138d2565b905060200281019061100a9190613901565b6110189060208101906132de565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061104f5761104f6138d2565b90506020028101906110619190613901565b61106f90602081019061393f565b60405161107d92919061386f565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106110cd576110cd6138d2565b90506020028101906110df9190613901565b6110ed90602081019061393f565b6040516110fb92919061386f565b6040518091039020858583818110611115576111156138d2565b90506020028101906111279190613901565b6111359060208101906132de565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610fd8565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146111cd576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b6d565b6111dd60408201602083016132de565b67ffffffffffffffff81166000908152600360205260409020805481906112039061387f565b905060000361124a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b6d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611286908690600401613aa6565b600060405180830381600087803b1580156112a057600080fd5b505af19250505080156112b1575060015b611351573d8080156112df576040519150601f19603f3d011682016040523d82523d6000602084013e6112e4565b606091505b506112f160058535612818565b5083356000908152600460205260409020849061130e8282613e80565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113439084906132cb565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61138b612438565b60005b8181101561137e5760008383838181106113aa576113aa6138d2565b90506020028101906113bc9190613f7a565b6113c590613fae565b9050806020015161143057805167ffffffffffffffff1660009081526003602052604081206113f3916130cc565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261152e565b80604001515160000361146f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061149a908261405f565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906114c8908261405f565b5080604001516040516114db9190614179565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212836060015160405161152591906132cb565b60405180910390a35b5060010161138e565b61153f612438565b73ffffffffffffffffffffffffffffffffffffffff8116158061156a575067ffffffffffffffff8216155b156115a1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261169391614179565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061137e908261405f565b611748612438565b6007805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b906117c190831515815260200190565b60405180910390a150565b6117d4612438565b73ffffffffffffffffffffffffffffffffffffffff8116611821576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6118a0612438565b60075473ffffffffffffffffffffffffffffffffffffffff1615611901576119016118e060025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612824565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156119ae576119ae61196e60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6129a6565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611a3b576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4b60408201602083016132de565b611a58604083018361393f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611aaf9250905061387f565b15905080611b055750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611af09190614179565b9081526040519081900360200190205460ff16155b15611b3e57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b6d91906132cb565b60085474010000000000000000000000000000000000000000900460ff1661137e5761137e611b70606085018561393f565b810190611b7d919061317e565b611b8890600161418b565b6124b9565b611b9860058261241d565b611bd1576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b6d565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611c189061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c449061387f565b8015611c915780601f10611c6657610100808354040283529160200191611c91565b820191906000526020600020905b815481529060010190602001808311611c7457829003601f168201915b50505050508152602001600382018054611caa9061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd69061387f565b8015611d235780601f10611cf857610100808354040283529160200191611d23565b820191906000526020600020905b815481529060010190602001808311611d0657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611da65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611d51565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611df860028301826130cc565b611e066003830160006130cc565b611e14600483016000613106565b50611e22905060058361280c565b50611e2c81612aaa565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611e849061387f565b9050600003611ecb576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b6d565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611efb9061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054611f279061387f565b8015611f745780601f10611f4957610100808354040283529160200191611f74565b820191906000526020600020905b815481529060010190602001808311611f5757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611fd59061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546120019061387f565b801561204e5780601f106120235761010080835404028352916020019161204e565b820191906000526020600020905b81548152906001019060200180831161203157829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906120b5908b90869060040161419e565b602060405180830381865afa1580156120d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f6919061426b565b60075490915073ffffffffffffffffffffffffffffffffffffffff16158015906121af57506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061426b565b105b156121d9576007546121d99073ffffffffffffffffffffffffffffffffffffffff16333084612b1c565b60005b875181101561232c5761224c33308a84815181106121fc576121fc6138d2565b6020026020010151602001518b858151811061221a5761221a6138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b1c909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061227c5761227c6138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146123245760025488516123249173ffffffffffffffffffffffffffffffffffffffff16908a90849081106122d5576122d56138d2565b6020026020010151602001518a84815181106122f3576122f36138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128249092919063ffffffff16565b6001016121dc565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561235f576000612361565b825b8a856040518463ffffffff1660e01b815260040161238092919061419e565b60206040518083038185885af115801561239e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123c3919061426b565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516123f691815260200190565b60405180910390a1505050509392505050565b612411612438565b61241a81612b7a565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b6d565b806001166001036124fc576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612530565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161254591815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260075460008085526020850190935290935061137e92750100000000000000000000000000000000000000000090910467ffffffffffffffff16916125d7565b60408051808201909152600080825260208201528152602001906001900390816125b05790505b5083611e5b565b80471015612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b6d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146126a2576040519150601f19603f3d011682016040523d82523d6000602084013e6126a7565b606091505b505090508061137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b6d565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261137e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612c6f565b60006124318383612d7b565b60006124318383612e6e565b8015806128c457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c2919061426b565b155b612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b6d565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261137e9084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161278a565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a41919061426b565b612a4b919061418b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612aa49085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161278a565b50505050565b612ab2612438565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612aee9084906004016133e9565b600060405180830381600087803b158015612b0857600080fd5b505af1158015611173573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aa49085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161278a565b3373ffffffffffffffffffffffffffffffffffffffff821603612bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b6d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612cd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ebd9092919063ffffffff16565b80519091501561137e5780806020019051810190612cef9190614284565b61137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b6d565b60008181526001830160205260408120548015612e64576000612d9f6001836142a1565b8554909150600090612db3906001906142a1565b9050818114612e18576000866000018281548110612dd357612dd36138d2565b9060005260206000200154905080876000018481548110612df657612df66138d2565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612e2957612e296142b4565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061063a565b600091505061063a565b6000818152600183016020526040812054612eb55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561063a565b50600061063a565b6060612ecc8484600085612ed4565b949350505050565b606082471015612f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b6d565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f8f9190614179565b60006040518083038185875af1925050503d8060008114612fcc576040519150601f19603f3d011682016040523d82523d6000602084013e612fd1565b606091505b5091509150612fe287838387612fed565b979650505050505050565b6060831561308357825160000361307c5773ffffffffffffffffffffffffffffffffffffffff85163b61307c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b6d565b5081612ecc565b612ecc83838151156130985781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d91906132cb565b5080546130d89061387f565b6000825580601f106130e8575050565b601f01602090049060005260206000209081019061241a9190613127565b508054600082556002029060005260206000209081019061241a9190613140565b5b8082111561313c5760008155600101613128565b5090565b5b8082111561313c5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613141565b60006020828403121561319057600080fd5b5035919050565b67ffffffffffffffff8116811461241a57600080fd5b6000806000604084860312156131c257600080fd5b83356131cd81613197565b9250602084013567ffffffffffffffff808211156131ea57600080fd5b818601915086601f8301126131fe57600080fd5b81358181111561320d57600080fd5b87602082850101111561321f57600080fd5b6020830194508093505050509250925092565b801515811461241a57600080fd5b60006020828403121561325257600080fd5b813561243181613232565b60005b83811015613278578181015183820152602001613260565b50506000910152565b6000815180845261329981602086016020860161325d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124316020830184613281565b6000602082840312156132f057600080fd5b813561243181613197565b60408152600061330e6040830185613281565b82810360208401526133208185613281565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461241a57600080fd5b60008060006060848603121561336057600080fd5b833561336b81613329565b9250602084013561337b81613329565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156133de578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016133a1565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261342360c0840182613281565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261345f8383613281565b925060808601519150808584030160a086015250613320828261338c565b6000806040838503121561349057600080fd5b8235915060208301356134a281613329565b809150509250929050565b60008083601f8401126134bf57600080fd5b50813567ffffffffffffffff8111156134d757600080fd5b6020830191508360208260051b85010111156134f257600080fd5b9250929050565b6000806000806040858703121561350f57600080fd5b843567ffffffffffffffff8082111561352757600080fd5b613533888389016134ad565b9096509450602087013591508082111561354c57600080fd5b50613559878288016134ad565b95989497509550505050565b60006020828403121561357757600080fd5b813567ffffffffffffffff81111561358e57600080fd5b820160a0818503121561243157600080fd5b600080602083850312156135b357600080fd5b823567ffffffffffffffff8111156135ca57600080fd5b6135d6858286016134ad565b90969095509350505050565b600080604083850312156135f557600080fd5b823561360081613197565b915060208301356134a281613329565b60006020828403121561362257600080fd5b813561243181613329565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561367f5761367f61362d565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136cc576136cc61362d565b604052919050565b600082601f8301126136e557600080fd5b813567ffffffffffffffff8111156136ff576136ff61362d565b61373060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613685565b81815284602083860101111561374557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561377757600080fd5b833561378281613197565b925060208481013567ffffffffffffffff808211156137a057600080fd5b818701915087601f8301126137b457600080fd5b8135818111156137c6576137c661362d565b6137d4848260051b01613685565b81815260069190911b8301840190848101908a8311156137f357600080fd5b938501935b8285101561383f576040858c0312156138115760008081fd5b61381961365c565b853561382481613329565b815285870135878201528252604090940193908501906137f8565b96505050604087013592508083111561385757600080fd5b5050613865868287016136d4565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061389357607f821691505b6020821081036138cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261393557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261397457600080fd5b83018035915067ffffffffffffffff82111561398f57600080fd5b6020019150368190038213156134f257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139d957600080fd5b830160208101925035905067ffffffffffffffff8111156139f957600080fd5b8036038213156134f257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133de578135613a7481613329565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613a61565b602081528135602082015260006020830135613ac181613197565b67ffffffffffffffff8082166040850152613adf60408601866139a4565b925060a06060860152613af660c086018483613a08565b925050613b0660608601866139a4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613b3c858385613a08565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613b7557600080fd5b60209288019283019235915083821115613b8e57600080fd5b8160061b3603831315613ba057600080fd5b8685030160a0870152612fe2848284613a51565b601f82111561137e576000816000526020600020601f850160051c81016020861015613bdd5750805b601f850160051c820191505b81811015613bfc57828155600101613be9565b505050505050565b67ffffffffffffffff831115613c1c57613c1c61362d565b613c3083613c2a835461387f565b83613bb4565b6000601f841160018114613c825760008515613c4c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611173565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613cd15786850135825560209485019460019092019101613cb1565b5086821015613d0c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613d5881613329565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613dbe57613dbe61362d565b805483825580841015613e4b5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613dff57613dff613d1e565b8086168614613e1057613e10613d1e565b5060008360005260206000208360011b81018760011b820191505b80821015613e46578282558284830155600282019150613e2b565b505050505b5060008181526020812083915b85811015613bfc57613e6a8383613d4d565b6040929092019160029190910190600101613e58565b81358155600181016020830135613e9681613197565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ed6604086018661393f565b93509150613ee8838360028701613c04565b613ef5606086018661393f565b93509150613f07838360038701613c04565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613f3e57600080fd5b918401918235915080821115613f5357600080fd5b506020820191508060061b3603821315613f6c57600080fd5b612aa4818360048601613da5565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261393557600080fd5b600060808236031215613fc057600080fd5b6040516080810167ffffffffffffffff8282108183111715613fe457613fe461362d565b8160405284359150613ff582613197565b90825260208401359061400782613232565b816020840152604085013591508082111561402157600080fd5b61402d368387016136d4565b6040840152606085013591508082111561404657600080fd5b50614053368286016136d4565b60608301525092915050565b815167ffffffffffffffff8111156140795761407961362d565b61408d81614087845461387f565b84613bb4565b602080601f8311600181146140e057600084156140aa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613bfc565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561412d5788860151825594840194600190910190840161410e565b508582101561416957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161393581846020870161325d565b8082018082111561063a5761063a613d1e565b67ffffffffffffffff83168152604060208201526000825160a060408401526141ca60e0840182613281565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526142068383613281565b92506040860151915080858403016080860152614223838361338c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506142618282613281565b9695505050505050565b60006020828403121561427d57600080fd5b5051919050565b60006020828403121561429657600080fd5b815161243181613232565b8181038181111561063a5761063a613d1e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -424,6 +424,28 @@ func (_PingPongDemo *PingPongDemoCallerSession) SFeeToken() (common.Address, err return _PingPongDemo.Contract.SFeeToken(&_PingPongDemo.CallOpts) } +func (_PingPongDemo *PingPongDemoCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "s_shouldUsePreFunding") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) SShouldUsePreFunding() (bool, error) { + return _PingPongDemo.Contract.SShouldUsePreFunding(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) SShouldUsePreFunding() (bool, error) { + return _PingPongDemo.Contract.SShouldUsePreFunding(&_PingPongDemo.CallOpts) +} + func (_PingPongDemo *PingPongDemoCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "typeAndVersion") @@ -602,6 +624,18 @@ func (_PingPongDemo *PingPongDemoTransactorSession) UpdateFeeToken(token common. return _PingPongDemo.Contract.UpdateFeeToken(&_PingPongDemo.TransactOpts, token) } +func (_PingPongDemo *PingPongDemoTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) +} + +func (_PingPongDemo *PingPongDemoSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdatePreFundingStatus(&_PingPongDemo.TransactOpts, usePreFunding) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdatePreFundingStatus(&_PingPongDemo.TransactOpts, usePreFunding) +} + func (_PingPongDemo *PingPongDemoTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "updateRouter", newRouter) } @@ -2561,6 +2595,123 @@ func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDe return event, nil } +type PingPongDemoPreFundingStateUpdatedIterator struct { + Event *PingPongDemoPreFundingStateUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoPreFundingStateUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPreFundingStateUpdated) + 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(PingPongDemoPreFundingStateUpdated) + 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 *PingPongDemoPreFundingStateUpdatedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoPreFundingStateUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoPreFundingStateUpdated struct { + UsePreFunding bool + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*PingPongDemoPreFundingStateUpdatedIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return &PingPongDemoPreFundingStateUpdatedIterator{contract: _PingPongDemo.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoPreFundingStateUpdated) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoPreFundingStateUpdated) + if err := _PingPongDemo.contract.UnpackLog(event, "PreFundingStateUpdated", 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) ParsePreFundingStateUpdated(log types.Log) (*PingPongDemoPreFundingStateUpdated, error) { + event := new(PingPongDemoPreFundingStateUpdated) + if err := _PingPongDemo.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type PingPongDemoTokensWithdrawnByOwnerIterator struct { Event *PingPongDemoTokensWithdrawnByOwner @@ -2735,6 +2886,8 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, return _PingPongDemo.ParsePing(log) case _PingPongDemo.abi.Events["Pong"].ID: return _PingPongDemo.ParsePong(log) + case _PingPongDemo.abi.Events["PreFundingStateUpdated"].ID: + return _PingPongDemo.ParsePreFundingStateUpdated(log) case _PingPongDemo.abi.Events["TokensWithdrawnByOwner"].ID: return _PingPongDemo.ParseTokensWithdrawnByOwner(log) @@ -2803,6 +2956,10 @@ func (PingPongDemoPong) Topic() common.Hash { return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") } +func (PingPongDemoPreFundingStateUpdated) Topic() common.Hash { + return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") +} + func (PingPongDemoTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -2834,6 +2991,8 @@ type PingPongDemoInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) + SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) + TypeAndVersion(opts *bind.CallOpts) (string, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -2862,6 +3021,8 @@ type PingPongDemoInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2958,6 +3119,12 @@ type PingPongDemoInterface interface { ParsePong(log types.Log) (*PingPongDemoPong, error) + FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*PingPongDemoPreFundingStateUpdatedIterator, error) + + WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoPreFundingStateUpdated) (event.Subscription, error) + + ParsePreFundingStateUpdated(log types.Log) (*PingPongDemoPreFundingStateUpdated, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*PingPongDemoTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *PingPongDemoTokensWithdrawnByOwner, token []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 14d2a45c43..9519116ed9 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004dc338038062004dc38339810160408190526200003491620005eb565b8282818181803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000163565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821681179092556007805493861693909116831790556200012d92506000196200020e565b5050505080600262000140919062000644565b600860156101000a81548160ff021916908360ff16021790555050505062000734565b336001600160a01b03821603620001bd5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200028c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000676565b155b620003005760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003589185916200035d16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ac906001600160a01b0385169084906200042e565b805190915015620003585780806020019051810190620003cd919062000690565b620003585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043f848460008562000447565b949350505050565b606082471015620004aa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c89190620006e1565b60006040518083038185875af1925050503d806000811462000507576040519150601f19603f3d011682016040523d82523d6000602084013e6200050c565b606091505b50909250905062000520878383876200052b565b979650505050505050565b606083156200059f57825160000362000597576001600160a01b0385163b620005975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043f565b6200043f8383815115620005b65781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006ff565b6001600160a01b0381168114620005e857600080fd5b50565b6000806000606084860312156200060157600080fd5b83516200060e81620005d2565b60208501519093506200062181620005d2565b604085015190925060ff811681146200063957600080fd5b809150509250925092565b60ff81811683821602908116908181146200066f57634e487b7160e01b600052601160045260246000fd5b5092915050565b6000602082840312156200068957600080fd5b5051919050565b600060208284031215620006a357600080fd5b81518015158114620006b457600080fd5b9392505050565b60005b83811015620006d8578181015183820152602001620006be565b50506000910152565b60008251620006f5818460208701620006bb565b9190910192915050565b602081526000825180602084015262000720816040850160208701620006bb565b601f01601f19169190910160400192915050565b61467f80620007446000396000f3fe6080604052600436106101c65760003560e01c80638f491cba116100f7578063c89245d511610095578063e89b448511610064578063e89b4485146105df578063ef686d8e14610600578063f2fde38b14610620578063ff2deec31461064057600080fd5b8063c89245d514610541578063cf6730f814610561578063e4ca875414610581578063e6c725f5146105a157600080fd5b8063b187bd26116100d1578063b187bd2614610486578063b5a11011146104b6578063bee518a4146104d6578063c851cc321461052157600080fd5b80638f491cba1461041b5780639fe74e261461043b578063b0f479a11461045b57600080fd5b80635e35359e1161016457806379ba50971161013e57806379ba50971461039b5780638462a2b9146103b057806385572ffb146103d05780638da5cb5b146103f057600080fd5b80635e35359e1461032e5780636939cd971461034e5780636d62d6331461037b57600080fd5b8063181f5a77116101a0578063181f5a77146102495780632874d8bf1461029f5780632b6e5d63146102b457806335f170ef1461030057600080fd5b80630a9094dc146101d25780630e958d6b1461020757806316c38b3c1461022757600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004613492565b61066d565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506101f26102223660046134c1565b610680565b34801561023357600080fd5b50610247610242366004613554565b6106cb565b005b34801561025557600080fd5b506102926040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b6040516101fe91906135df565b3480156102ab57600080fd5b5061024761071d565b3480156102c057600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030c57600080fd5b5061032061031b3660046135f2565b610759565b6040516101fe92919061360f565b34801561033a57600080fd5b5061024761034936600461365f565b610885565b34801561035a57600080fd5b5061036e610369366004613492565b61095a565b6040516101fe91906136fd565b34801561038757600080fd5b50610247610396366004613791565b610b65565b3480156103a757600080fd5b50610247610d7c565b3480156103bc57600080fd5b506102476103cb36600461380d565b610e79565b3480156103dc57600080fd5b506102476103eb366004613879565b6111ba565b3480156103fc57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102db565b34801561042757600080fd5b50610247610436366004613492565b6113c3565b34801561044757600080fd5b506102476104563660046138b4565b61159e565b34801561046757600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102db565b34801561049257600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101f2565b3480156104c257600080fd5b506102476104d13660046138f6565b61173b565b3480156104e257600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561052d57600080fd5b5061024761053c366004613924565b611943565b34801561054d57600080fd5b5061024761055c366004613924565b611a0f565b34801561056d57600080fd5b5061024761057c366004613879565b611b79565b34801561058d57600080fd5b5061024761059c366004613492565b611d04565b3480156105ad57600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff90911681526020016101fe565b6105f26105ed366004613a76565b611fd2565b6040519081526020016101fe565b34801561060c57600080fd5b5061024761061b366004613b83565b612580565b34801561062c57600080fd5b5061024761063b366004613924565b612609565b34801561064c57600080fd5b506007546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b600061067a60058361261a565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106af9085908590613ba6565b9081526040519081900360200190205460ff1690509392505050565b6106d3612635565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610725612635565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905561075760016126b6565b565b60036020526000908152604090208054819061077490613bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546107a090613bb6565b80156107ed5780601f106107c2576101008083540402835291602001916107ed565b820191906000526020600020905b8154815290600101906020018083116107d057829003601f168201915b50505050509080600101805461080290613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461082e90613bb6565b801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b5050505050905082565b61088d612635565b73ffffffffffffffffffffffffffffffffffffffff83166108cd576108c873ffffffffffffffffffffffffffffffffffffffff8316826128f2565b6108ee565b6108ee73ffffffffffffffffffffffffffffffffffffffff84168383612a4c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161094d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109c990613bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590613bb6565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b50505050508152602001600382018054610a5b90613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8790613bb6565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b575760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b02565b505050915250909392505050565b610b6d612635565b610b7860058361261a565b610bb6576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610c375760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610be2565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c8760028301826133e0565b610c956003830160006133e0565b610ca360048301600061341a565b50610cb19050600584612b20565b5060005b8151811015610d2b57610d2383838381518110610cd457610cd4613c09565b602002602001015160200151848481518110610cf257610cf2613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a4c9092919063ffffffff16565b600101610cb5565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bad565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e81612635565b60005b818110156110145760036000848484818110610ea257610ea2613c09565b9050602002810190610eb49190613c38565b610ec29060208101906135f2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610ef957610ef9613c09565b9050602002810190610f0b9190613c38565b610f19906020810190613c76565b604051610f27929190613ba6565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f6e57610f6e613c09565b9050602002810190610f809190613c38565b610f8e906020810190613c76565b604051610f9c929190613ba6565b6040518091039020838383818110610fb657610fb6613c09565b9050602002810190610fc89190613c38565b610fd69060208101906135f2565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e84565b5060005b838110156111b35760016003600087878581811061103857611038613c09565b905060200281019061104a9190613c38565b6110589060208101906135f2565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061108f5761108f613c09565b90506020028101906110a19190613c38565b6110af906020810190613c76565b6040516110bd929190613ba6565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061110d5761110d613c09565b905060200281019061111f9190613c38565b61112d906020810190613c76565b60405161113b929190613ba6565b604051809103902085858381811061115557611155613c09565b90506020028101906111679190613c38565b6111759060208101906135f2565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611018565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461120d576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bad565b61121d60408201602083016135f2565b67ffffffffffffffff811660009081526003602052604090208054819061124390613bb6565b905060000361128a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bad565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906112c6908690600401613ddd565b600060405180830381600087803b1580156112e057600080fd5b505af19250505080156112f1575060015b611391573d80801561131f576040519150601f19603f3d011682016040523d82523d6000602084013e611324565b606091505b5061133160058535612b2c565b5083356000908152600460205260409020849061134e82826141b7565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113839084906135df565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6008547501000000000000000000000000000000000000000000900460ff16158061140b57506008547501000000000000000000000000000000000000000000900460ff1681105b156114135750565b60085460019061143f907501000000000000000000000000000000000000000000900460ff16836142b1565b1161159b5760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151291906142ec565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561155957600080fd5b505af115801561156d573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6115a6612635565b60005b818110156113be5760008383838181106115c5576115c5613c09565b90506020028101906115d79190614309565b6115e09061433d565b9050806020015161164b57805167ffffffffffffffff16600090815260036020526040812061160e916133e0565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611732565b80604001515160000361168a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff16600090815260036020526040908190209082015181906116b690826143ee565b50606082015160018201906116cb90826143ee565b5081604001516040516116de9190614508565b6040518091039020826000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212846060015160405161172891906135df565b60405180910390a3505b506001016115a9565b611743612635565b73ffffffffffffffffffffffffffffffffffffffff8116158061176e575067ffffffffffffffff8216155b156117a5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261189691614508565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113be90826143ee565b61194b612635565b73ffffffffffffffffffffffffffffffffffffffff8116611998576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611a17612635565b60075473ffffffffffffffffffffffffffffffffffffffff1615611a7857611a78611a5760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612b38565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611b2557611b25611ae560025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612cba565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611bb2576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bc260408201602083016135f2565b611bcf6040830183613c76565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611c2692509050613bb6565b15905080611c7c5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611c679190614508565b9081526040519081900360200190205460ff16155b15611cb557806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bad91906135df565b60085474010000000000000000000000000000000000000000900460ff166113be576113be611ce76060850185613c76565b810190611cf49190613492565b611cff90600161451a565b6126b6565b611d0f60058261261a565b611d48576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610bad565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611d8f90613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb90613bb6565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b50505050508152602001600382018054611e2190613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4d90613bb6565b8015611e9a5780601f10611e6f57610100808354040283529160200191611e9a565b820191906000526020600020905b815481529060010190602001808311611e7d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611f1d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611ec8565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611f6f60028301826133e0565b611f7d6003830160006133e0565b611f8b60048301600061341a565b50611f999050600583612b20565b50611fa381612dbe565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611ffb90613bb6565b9050600003612042576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bad565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061207290613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461209e90613bb6565b80156120eb5780601f106120c0576101008083540402835291602001916120eb565b820191906000526020600020905b8154815290600101906020018083116120ce57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161214c90613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461217890613bb6565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded9061222c908b90869060040161452d565b602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d91906145fa565b60075490915073ffffffffffffffffffffffffffffffffffffffff161580159061232657506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612300573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232491906145fa565b105b15612350576007546123509073ffffffffffffffffffffffffffffffffffffffff16333084612e30565b60005b87518110156124a3576123c333308a848151811061237357612373613c09565b6020026020010151602001518b858151811061239157612391613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e30909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106123f3576123f3613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461249b57600254885161249b9173ffffffffffffffffffffffffffffffffffffffff16908a908490811061244c5761244c613c09565b6020026020010151602001518a848151811061246a5761246a613c09565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b389092919063ffffffff16565b600101612353565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156124d65760006124d8565b825b8a856040518463ffffffff1660e01b81526004016124f792919061452d565b60206040518083038185885af1158015612515573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061253a91906145fa565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161256d91815260200190565b60405180910390a1505050509392505050565b612588612635565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b612611612635565b61159b81612e8e565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bad565b806001166001036126f9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a161272d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612736816113c3565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161278e91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561280857816020015b60408051808201909152600080825260208201528152602001906001900390816127e15790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061285f60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b81526004016128af92919061452d565b6020604051808303816000875af11580156128ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113be91906145fa565b8047101561295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bad565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b50509050806113be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bad565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113be9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f83565b600061262e838361308f565b600061262e8383613182565b801580612bd857506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd691906145fa565b155b612c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bad565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113be9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a9e565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5591906145fa565b612d5f919061451a565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612db89085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a9e565b50505050565b612dc6612635565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612e029084906004016136fd565b600060405180830381600087803b158015612e1c57600080fd5b505af11580156111b3573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612db89085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a9e565b3373ffffffffffffffffffffffffffffffffffffffff821603612f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bad565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612fe5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131d19092919063ffffffff16565b8051909150156113be57808060200190518101906130039190614613565b6113be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bad565b600081815260018301602052604081205480156131785760006130b3600183614630565b85549091506000906130c790600190614630565b905081811461312c5760008660000182815481106130e7576130e7613c09565b906000526020600020015490508087600001848154811061310a5761310a613c09565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061313d5761313d614643565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061067a565b600091505061067a565b60008181526001830160205260408120546131c95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561067a565b50600061067a565b60606131e084846000856131e8565b949350505050565b60608247101561327a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bad565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132a39190614508565b60006040518083038185875af1925050503d80600081146132e0576040519150601f19603f3d011682016040523d82523d6000602084013e6132e5565b606091505b50915091506132f687838387613301565b979650505050505050565b606083156133975782516000036133905773ffffffffffffffffffffffffffffffffffffffff85163b613390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bad565b50816131e0565b6131e083838151156133ac5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad91906135df565b5080546133ec90613bb6565b6000825580601f106133fc575050565b601f01602090049060005260206000209081019061159b919061343b565b508054600082556002029060005260206000209081019061159b9190613454565b5b80821115613450576000815560010161343c565b5090565b5b808211156134505780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613455565b6000602082840312156134a457600080fd5b5035919050565b67ffffffffffffffff8116811461159b57600080fd5b6000806000604084860312156134d657600080fd5b83356134e1816134ab565b9250602084013567ffffffffffffffff808211156134fe57600080fd5b818601915086601f83011261351257600080fd5b81358181111561352157600080fd5b87602082850101111561353357600080fd5b6020830194508093505050509250925092565b801515811461159b57600080fd5b60006020828403121561356657600080fd5b813561262e81613546565b60005b8381101561358c578181015183820152602001613574565b50506000910152565b600081518084526135ad816020860160208601613571565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061262e6020830184613595565b60006020828403121561360457600080fd5b813561262e816134ab565b6040815260006136226040830185613595565b82810360208401526136348185613595565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159b57600080fd5b60008060006060848603121561367457600080fd5b833561367f8161363d565b9250602084013561368f8161363d565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136f2578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016136b5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261373760c0840182613595565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137738383613595565b925060808601519150808584030160a08601525061363482826136a0565b600080604083850312156137a457600080fd5b8235915060208301356137b68161363d565b809150509250929050565b60008083601f8401126137d357600080fd5b50813567ffffffffffffffff8111156137eb57600080fd5b6020830191508360208260051b850101111561380657600080fd5b9250929050565b6000806000806040858703121561382357600080fd5b843567ffffffffffffffff8082111561383b57600080fd5b613847888389016137c1565b9096509450602087013591508082111561386057600080fd5b5061386d878288016137c1565b95989497509550505050565b60006020828403121561388b57600080fd5b813567ffffffffffffffff8111156138a257600080fd5b820160a0818503121561262e57600080fd5b600080602083850312156138c757600080fd5b823567ffffffffffffffff8111156138de57600080fd5b6138ea858286016137c1565b90969095509350505050565b6000806040838503121561390957600080fd5b8235613914816134ab565b915060208301356137b68161363d565b60006020828403121561393657600080fd5b813561262e8161363d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561399357613993613941565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139e0576139e0613941565b604052919050565b600082601f8301126139f957600080fd5b813567ffffffffffffffff811115613a1357613a13613941565b613a4460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613999565b818152846020838601011115613a5957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a8b57600080fd5b8335613a96816134ab565b925060208481013567ffffffffffffffff80821115613ab457600080fd5b818701915087601f830112613ac857600080fd5b813581811115613ada57613ada613941565b613ae8848260051b01613999565b81815260069190911b8301840190848101908a831115613b0757600080fd5b938501935b82851015613b53576040858c031215613b255760008081fd5b613b2d613970565b8535613b388161363d565b81528587013587820152825260409094019390850190613b0c565b965050506040870135925080831115613b6b57600080fd5b5050613b79868287016139e8565b9150509250925092565b600060208284031215613b9557600080fd5b813560ff8116811461262e57600080fd5b8183823760009101908152919050565b600181811c90821680613bca57607f821691505b602082108103613c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c6c57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cab57600080fd5b83018035915067ffffffffffffffff821115613cc657600080fd5b60200191503681900382131561380657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d1057600080fd5b830160208101925035905067ffffffffffffffff811115613d3057600080fd5b80360382131561380657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136f2578135613dab8161363d565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d98565b602081528135602082015260006020830135613df8816134ab565b67ffffffffffffffff8082166040850152613e166040860186613cdb565b925060a06060860152613e2d60c086018483613d3f565b925050613e3d6060860186613cdb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e73858385613d3f565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613eac57600080fd5b60209288019283019235915083821115613ec557600080fd5b8160061b3603831315613ed757600080fd5b8685030160a08701526132f6848284613d88565b601f8211156113be576000816000526020600020601f850160051c81016020861015613f145750805b601f850160051c820191505b81811015613f3357828155600101613f20565b505050505050565b67ffffffffffffffff831115613f5357613f53613941565b613f6783613f618354613bb6565b83613eeb565b6000601f841160018114613fb95760008515613f835750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556111b3565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140085786850135825560209485019460019092019101613fe8565b5086821015614043577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561408f8161363d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140f5576140f5613941565b8054838255808410156141825760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461413657614136614055565b808616861461414757614147614055565b5060008360005260206000208360011b81018760011b820191505b8082101561417d578282558284830155600282019150614162565b505050505b5060008181526020812083915b85811015613f33576141a18383614084565b604092909201916002919091019060010161418f565b813581556001810160208301356141cd816134ab565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561420d6040860186613c76565b9350915061421f838360028701613f3b565b61422c6060860186613c76565b9350915061423e838360038701613f3b565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261427557600080fd5b91840191823591508082111561428a57600080fd5b506020820191508060061b36038213156142a357600080fd5b612db88183600486016140dc565b6000826142e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142fe57600080fd5b815161262e8161363d565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c6c57600080fd5b60006080823603121561434f57600080fd5b6040516080810167ffffffffffffffff828210818311171561437357614373613941565b8160405284359150614384826134ab565b90825260208401359061439682613546565b81602084015260408501359150808211156143b057600080fd5b6143bc368387016139e8565b604084015260608501359150808211156143d557600080fd5b506143e2368286016139e8565b60608301525092915050565b815167ffffffffffffffff81111561440857614408613941565b61441c816144168454613bb6565b84613eeb565b602080601f83116001811461446f57600084156144395750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f33565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144bc5788860151825594840194600190910190840161449d565b50858210156144f857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613c6c818460208701613571565b8082018082111561067a5761067a614055565b67ffffffffffffffff83168152604060208201526000825160a0604084015261455960e0840182613595565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145958383613595565b925060408601519150808584030160808601526145b283836136a0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145f08282613595565b9695505050505050565b60006020828403121561460c57600080fd5b5051919050565b60006020828403121561462557600080fd5b815161262e81613546565b8181038181111561067a5761067a614055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004ef638038062004ef6833981016040819052620000349162000616565b82828181600182803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200018e565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03928316179055600780549185166001600160a81b03199092168217600160a01b85151502179055159050620001575760025460075462000157916001600160a01b03918216911660001962000239565b50505050508060026200016b91906200066f565b600860156101000a81548160ff021916908360ff1602179055505050506200075f565b336001600160a01b03821603620001e85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002b75750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200028f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b59190620006a1565b155b6200032b5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003839185916200038816565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003d7906001600160a01b03851690849062000459565b805190915015620003835780806020019051810190620003f89190620006bb565b620003835760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b60606200046a848460008562000472565b949350505050565b606082471015620004d55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004f391906200070c565b60006040518083038185875af1925050503d806000811462000532576040519150601f19603f3d011682016040523d82523d6000602084013e62000537565b606091505b5090925090506200054b8783838762000556565b979650505050505050565b60608315620005ca578251600003620005c2576001600160a01b0385163b620005c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b50816200046a565b6200046a8383815115620005e15781518083602001fd5b8060405162461bcd60e51b81526004016200008a91906200072a565b6001600160a01b03811681146200061357600080fd5b50565b6000806000606084860312156200062c57600080fd5b83516200063981620005fd565b60208501519093506200064c81620005fd565b604085015190925060ff811681146200066457600080fd5b809150509250925092565b60ff81811683821602908116908181146200069a57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215620006b457600080fd5b5051919050565b600060208284031215620006ce57600080fd5b81518015158114620006df57600080fd5b9392505050565b60005b8381101562000703578181015183820152602001620006e9565b50506000910152565b6000825162000720818460208701620006e6565b9190910192915050565b60208152600082518060208401526200074b816040850160208701620006e6565b601f01601f19169190910160400192915050565b614787806200076f6000396000f3fe6080604052600436106101dc5760003560e01c80639fe74e2611610102578063cf6730f811610095578063ec4a9a2611610064578063ec4a9a2614610637578063ef686d8e14610669578063f2fde38b14610689578063ff2deec3146106a957600080fd5b8063cf6730f814610598578063e4ca8754146105b8578063e6c725f5146105d8578063e89b44851461061657600080fd5b8063bee518a4116100d1578063bee518a4146104ec578063c25da3fe14610538578063c851cc3214610558578063c89245d51461057857600080fd5b80639fe74e2614610451578063b0f479a114610471578063b187bd261461049c578063b5a11011146104cc57600080fd5b80635e35359e1161017a5780638462a2b9116101495780638462a2b9146103c657806385572ffb146103e65780638da5cb5b146104065780638f491cba1461043157600080fd5b80635e35359e146103445780636939cd97146103645780636d62d6331461039157806379ba5097146103b157600080fd5b8063181f5a77116101b6578063181f5a771461025f5780632874d8bf146102b55780632b6e5d63146102ca57806335f170ef1461031657600080fd5b80630a9094dc146101e85780630e958d6b1461021d57806316c38b3c1461023d57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b5061020861020336600461359a565b6106d6565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b506102086102383660046135c9565b6106e9565b34801561024957600080fd5b5061025d61025836600461365c565b610734565b005b34801561026b57600080fd5b506102a86040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b60405161021491906136e7565b3480156102c157600080fd5b5061025d610786565b3480156102d657600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b34801561032257600080fd5b506103366103313660046136fa565b6107c2565b604051610214929190613717565b34801561035057600080fd5b5061025d61035f366004613767565b6108ee565b34801561037057600080fd5b5061038461037f36600461359a565b6109c3565b6040516102149190613805565b34801561039d57600080fd5b5061025d6103ac366004613899565b610bce565b3480156103bd57600080fd5b5061025d610de5565b3480156103d257600080fd5b5061025d6103e1366004613915565b610ee2565b3480156103f257600080fd5b5061025d610401366004613981565b611223565b34801561041257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102f1565b34801561043d57600080fd5b5061025d61044c36600461359a565b61142c565b34801561045d57600080fd5b5061025d61046c3660046139bc565b611608565b34801561047d57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102f1565b3480156104a857600080fd5b5060085474010000000000000000000000000000000000000000900460ff16610208565b3480156104d857600080fd5b5061025d6104e73660046139fe565b6117bc565b3480156104f857600080fd5b506007547501000000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610214565b34801561054457600080fd5b5061025d61055336600461365c565b6119c5565b34801561056457600080fd5b5061025d610573366004613a2c565b611a51565b34801561058457600080fd5b5061025d610593366004613a2c565b611b1d565b3480156105a457600080fd5b5061025d6105b3366004613981565b611c87565b3480156105c457600080fd5b5061025d6105d336600461359a565b611e12565b3480156105e457600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610214565b610629610624366004613b7e565b6120e0565b604051908152602001610214565b34801561064357600080fd5b506007546102089074010000000000000000000000000000000000000000900460ff1681565b34801561067557600080fd5b5061025d610684366004613c8b565b61268e565b34801561069557600080fd5b5061025d6106a4366004613a2c565b612711565b3480156106b557600080fd5b506007546102f19073ffffffffffffffffffffffffffffffffffffffff1681565b60006106e3600583612722565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107189085908590613cae565b9081526040519081900360200190205460ff1690509392505050565b61073c61273d565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61078e61273d565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107c060016127be565b565b6003602052600090815260409020805481906107dd90613cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461080990613cbe565b80156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b50505050509080600101805461086b90613cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461089790613cbe565b80156108e45780601f106108b9576101008083540402835291602001916108e4565b820191906000526020600020905b8154815290600101906020018083116108c757829003601f168201915b5050505050905082565b6108f661273d565b73ffffffffffffffffffffffffffffffffffffffff83166109365761093173ffffffffffffffffffffffffffffffffffffffff8316826129fa565b610957565b61095773ffffffffffffffffffffffffffffffffffffffff84168383612b54565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109b691815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a3290613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e90613cbe565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b50505050508152602001600382018054610ac490613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613cbe565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bc05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b6b565b505050915250909392505050565b610bd661273d565b610be1600583612722565b610c1f576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610ca05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c4b565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610cf060028301826134e8565b610cfe6003830160006134e8565b610d0c600483016000613522565b50610d1a9050600584612c28565b5060005b8151811015610d9457610d8c83838381518110610d3d57610d3d613d11565b602002602001015160200151848481518110610d5b57610d5b613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b549092919063ffffffff16565b600101610d1e565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c16565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610eea61273d565b60005b8181101561107d5760036000848484818110610f0b57610f0b613d11565b9050602002810190610f1d9190613d40565b610f2b9060208101906136fa565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f6257610f62613d11565b9050602002810190610f749190613d40565b610f82906020810190613d7e565b604051610f90929190613cae565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610fd757610fd7613d11565b9050602002810190610fe99190613d40565b610ff7906020810190613d7e565b604051611005929190613cae565b604051809103902083838381811061101f5761101f613d11565b90506020028101906110319190613d40565b61103f9060208101906136fa565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610eed565b5060005b8381101561121c576001600360008787858181106110a1576110a1613d11565b90506020028101906110b39190613d40565b6110c19060208101906136fa565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110f8576110f8613d11565b905060200281019061110a9190613d40565b611118906020810190613d7e565b604051611126929190613cae565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061117657611176613d11565b90506020028101906111889190613d40565b611196906020810190613d7e565b6040516111a4929190613cae565b60405180910390208585838181106111be576111be613d11565b90506020028101906111d09190613d40565b6111de9060208101906136fa565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611081565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611276576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c16565b61128660408201602083016136fa565b67ffffffffffffffff81166000908152600360205260409020805481906112ac90613cbe565b90506000036112f3576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c16565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061132f908690600401613ee5565b600060405180830381600087803b15801561134957600080fd5b505af192505050801561135a575060015b6113fa573d808015611388576040519150601f19603f3d011682016040523d82523d6000602084013e61138d565b606091505b5061139a60058535612c34565b508335600090815260046020526040902084906113b782826142bf565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113ec9084906136e7565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6008547501000000000000000000000000000000000000000000900460ff16158061147457506008547501000000000000000000000000000000000000000000900460ff1681105b1561147c5750565b6008546001906114a8907501000000000000000000000000000000000000000000900460ff16836143b9565b116116055760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b000000000000000000000000000000000000000000000000000000008152750100000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906143f4565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115c357600080fd5b505af11580156115d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b61161061273d565b60005b8181101561142757600083838381811061162f5761162f613d11565b90506020028101906116419190614411565b61164a90614445565b905080602001516116b557805167ffffffffffffffff166000908152600360205260408120611678916134e8565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26117b3565b8060400151516000036116f4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061171f90826144f6565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061174d90826144f6565b5080604001516040516117609190614610565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516117aa91906136e7565b60405180910390a35b50600101611613565b6117c461273d565b73ffffffffffffffffffffffffffffffffffffffff811615806117ef575067ffffffffffffffff8216155b15611826576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261191891614610565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061142790826144f6565b6119cd61273d565b6007805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b90611a4690831515815260200190565b60405180910390a150565b611a5961273d565b73ffffffffffffffffffffffffffffffffffffffff8116611aa6576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611b2561273d565b60075473ffffffffffffffffffffffffffffffffffffffff1615611b8657611b86611b6560025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612c40565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611c3357611c33611bf360025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612dc2565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611cc0576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd060408201602083016136fa565b611cdd6040830183613d7e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611d3492509050613cbe565b15905080611d8a5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611d759190614610565b9081526040519081900360200190205460ff16155b15611dc357806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c1691906136e7565b60085474010000000000000000000000000000000000000000900460ff1661142757611427611df56060850185613d7e565b810190611e02919061359a565b611e0d906001614622565b6127be565b611e1d600582612722565b611e56576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c16565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e9d90613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec990613cbe565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b50505050508152602001600382018054611f2f90613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5b90613cbe565b8015611fa85780601f10611f7d57610100808354040283529160200191611fa8565b820191906000526020600020905b815481529060010190602001808311611f8b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561202b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611fd6565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905591925061207d60028301826134e8565b61208b6003830160006134e8565b612099600483016000613522565b506120a79050600583612c28565b506120b181612ec6565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061210990613cbe565b9050600003612150576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c16565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061218090613cbe565b80601f01602080910402602001604051908101604052809291908181526020018280546121ac90613cbe565b80156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161225a90613cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461228690613cbe565b80156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded9061233a908b908690600401614635565b602060405180830381865afa158015612357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237b9190614702565b60075490915073ffffffffffffffffffffffffffffffffffffffff161580159061243457506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561240e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124329190614702565b105b1561245e5760075461245e9073ffffffffffffffffffffffffffffffffffffffff16333084612f38565b60005b87518110156125b1576124d133308a848151811061248157612481613d11565b6020026020010151602001518b858151811061249f5761249f613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612f38909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061250157612501613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146125a95760025488516125a99173ffffffffffffffffffffffffffffffffffffffff16908a908490811061255a5761255a613d11565b6020026020010151602001518a848151811061257857612578613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c409092919063ffffffff16565b600101612461565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156125e45760006125e6565b825b8a856040518463ffffffff1660e01b8152600401612605929190614635565b60206040518083038185885af1158015612623573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126489190614702565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161267b91815260200190565b60405180910390a1505050509392505050565b61269661273d565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf390602001611a46565b61271961273d565b61160581612f96565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c16565b80600116600103612801576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612835565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b61283e8161142c565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161289691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561291057816020015b60408051808201909152600080825260208201528152602001906001900390816128e95790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061296760025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760159054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b81526004016129b7929190614635565b6020604051808303816000875af11580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190614702565b80471015612a64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c16565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612abe576040519150601f19603f3d011682016040523d82523d6000602084013e612ac3565b606091505b5050905080611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c16565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526114279084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261308b565b60006127368383613197565b6000612736838361328a565b801580612ce057506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cde9190614702565b155b612d6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c16565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526114279084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612ba6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5d9190614702565b612e679190614622565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612ec09085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612ba6565b50505050565b612ece61273d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612f0a908490600401613805565b600060405180830381600087803b158015612f2457600080fd5b505af115801561121c573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612ec09085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ba6565b3373ffffffffffffffffffffffffffffffffffffffff821603613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c16565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006130ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132d99092919063ffffffff16565b805190915015611427578080602001905181019061310b919061471b565b611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c16565b600081815260018301602052604081205480156132805760006131bb600183614738565b85549091506000906131cf90600190614738565b90508181146132345760008660000182815481106131ef576131ef613d11565b906000526020600020015490508087600001848154811061321257613212613d11565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806132455761324561474b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106e3565b60009150506106e3565b60008181526001830160205260408120546132d1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106e3565b5060006106e3565b60606132e884846000856132f0565b949350505050565b606082471015613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c16565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516133ab9190614610565b60006040518083038185875af1925050503d80600081146133e8576040519150601f19603f3d011682016040523d82523d6000602084013e6133ed565b606091505b50915091506133fe87838387613409565b979650505050505050565b6060831561349f5782516000036134985773ffffffffffffffffffffffffffffffffffffffff85163b613498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c16565b50816132e8565b6132e883838151156134b45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1691906136e7565b5080546134f490613cbe565b6000825580601f10613504575050565b601f0160209004906000526020600020908101906116059190613543565b5080546000825560020290600052602060002090810190611605919061355c565b5b808211156135585760008155600101613544565b5090565b5b808211156135585780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556000600182015560020161355d565b6000602082840312156135ac57600080fd5b5035919050565b67ffffffffffffffff8116811461160557600080fd5b6000806000604084860312156135de57600080fd5b83356135e9816135b3565b9250602084013567ffffffffffffffff8082111561360657600080fd5b818601915086601f83011261361a57600080fd5b81358181111561362957600080fd5b87602082850101111561363b57600080fd5b6020830194508093505050509250925092565b801515811461160557600080fd5b60006020828403121561366e57600080fd5b81356127368161364e565b60005b8381101561369457818101518382015260200161367c565b50506000910152565b600081518084526136b5816020860160208601613679565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612736602083018461369d565b60006020828403121561370c57600080fd5b8135612736816135b3565b60408152600061372a604083018561369d565b828103602084015261373c818561369d565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461160557600080fd5b60008060006060848603121561377c57600080fd5b833561378781613745565b9250602084013561379781613745565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156137fa578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016137bd565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261383f60c084018261369d565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261387b838361369d565b925060808601519150808584030160a08601525061373c82826137a8565b600080604083850312156138ac57600080fd5b8235915060208301356138be81613745565b809150509250929050565b60008083601f8401126138db57600080fd5b50813567ffffffffffffffff8111156138f357600080fd5b6020830191508360208260051b850101111561390e57600080fd5b9250929050565b6000806000806040858703121561392b57600080fd5b843567ffffffffffffffff8082111561394357600080fd5b61394f888389016138c9565b9096509450602087013591508082111561396857600080fd5b50613975878288016138c9565b95989497509550505050565b60006020828403121561399357600080fd5b813567ffffffffffffffff8111156139aa57600080fd5b820160a0818503121561273657600080fd5b600080602083850312156139cf57600080fd5b823567ffffffffffffffff8111156139e657600080fd5b6139f2858286016138c9565b90969095509350505050565b60008060408385031215613a1157600080fd5b8235613a1c816135b3565b915060208301356138be81613745565b600060208284031215613a3e57600080fd5b813561273681613745565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a9b57613a9b613a49565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613ae857613ae8613a49565b604052919050565b600082601f830112613b0157600080fd5b813567ffffffffffffffff811115613b1b57613b1b613a49565b613b4c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613aa1565b818152846020838601011115613b6157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b9357600080fd5b8335613b9e816135b3565b925060208481013567ffffffffffffffff80821115613bbc57600080fd5b818701915087601f830112613bd057600080fd5b813581811115613be257613be2613a49565b613bf0848260051b01613aa1565b81815260069190911b8301840190848101908a831115613c0f57600080fd5b938501935b82851015613c5b576040858c031215613c2d5760008081fd5b613c35613a78565b8535613c4081613745565b81528587013587820152825260409094019390850190613c14565b965050506040870135925080831115613c7357600080fd5b5050613c8186828701613af0565b9150509250925092565b600060208284031215613c9d57600080fd5b813560ff8116811461273657600080fd5b8183823760009101908152919050565b600181811c90821680613cd257607f821691505b602082108103613d0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613d7457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613db357600080fd5b83018035915067ffffffffffffffff821115613dce57600080fd5b60200191503681900382131561390e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e1857600080fd5b830160208101925035905067ffffffffffffffff811115613e3857600080fd5b80360382131561390e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156137fa578135613eb381613745565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613ea0565b602081528135602082015260006020830135613f00816135b3565b67ffffffffffffffff8082166040850152613f1e6040860186613de3565b925060a06060860152613f3560c086018483613e47565b925050613f456060860186613de3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f7b858385613e47565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613fb457600080fd5b60209288019283019235915083821115613fcd57600080fd5b8160061b3603831315613fdf57600080fd5b8685030160a08701526133fe848284613e90565b601f821115611427576000816000526020600020601f850160051c8101602086101561401c5750805b601f850160051c820191505b8181101561403b57828155600101614028565b505050505050565b67ffffffffffffffff83111561405b5761405b613a49565b61406f836140698354613cbe565b83613ff3565b6000601f8411600181146140c1576000851561408b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561121c565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561411057868501358255602094850194600190920191016140f0565b508682101561414b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561419781613745565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156141fd576141fd613a49565b80548382558084101561428a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461423e5761423e61415d565b808616861461424f5761424f61415d565b5060008360005260206000208360011b81018760011b820191505b8082101561428557828255828483015560028201915061426a565b505050505b5060008181526020812083915b8581101561403b576142a9838361418c565b6040929092019160029190910190600101614297565b813581556001810160208301356142d5816135b3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556143156040860186613d7e565b93509150614327838360028701614043565b6143346060860186613d7e565b93509150614346838360038701614043565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261437d57600080fd5b91840191823591508082111561439257600080fd5b506020820191508060061b36038213156143ab57600080fd5b612ec08183600486016141e4565b6000826143ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561440657600080fd5b815161273681613745565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d7457600080fd5b60006080823603121561445757600080fd5b6040516080810167ffffffffffffffff828210818311171561447b5761447b613a49565b816040528435915061448c826135b3565b90825260208401359061449e8261364e565b81602084015260408501359150808211156144b857600080fd5b6144c436838701613af0565b604084015260608501359150808211156144dd57600080fd5b506144ea36828601613af0565b60608301525092915050565b815167ffffffffffffffff81111561451057614510613a49565b6145248161451e8454613cbe565b84613ff3565b602080601f83116001811461457757600084156145415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561403b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156145c4578886015182559484019460019091019084016145a5565b508582101561460057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613d74818460208701613679565b808201808211156106e3576106e361415d565b67ffffffffffffffff83168152604060208201526000825160a0604084015261466160e084018261369d565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261469d838361369d565b925060408601519150808584030160808601526146ba83836137a8565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506146f8828261369d565b9695505050505050565b60006020828403121561471457600080fd5b5051919050565b60006020828403121561472d57600080fd5b81516127368161364e565b818103818111156106e3576106e361415d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -446,6 +446,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SFeeToken() (common. return _SelfFundedPingPong.Contract.SFeeToken(&_SelfFundedPingPong.CallOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "s_shouldUsePreFunding") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) SShouldUsePreFunding() (bool, error) { + return _SelfFundedPingPong.Contract.SShouldUsePreFunding(&_SelfFundedPingPong.CallOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SShouldUsePreFunding() (bool, error) { + return _SelfFundedPingPong.Contract.SShouldUsePreFunding(&_SelfFundedPingPong.CallOpts) +} + func (_SelfFundedPingPong *SelfFundedPingPongCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "typeAndVersion") @@ -648,6 +670,18 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateFeeToken(t return _SelfFundedPingPong.Contract.UpdateFeeToken(&_SelfFundedPingPong.TransactOpts, token) } +func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { + return _SelfFundedPingPong.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdatePreFundingStatus(&_SelfFundedPingPong.TransactOpts, usePreFunding) +} + +func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { + return _SelfFundedPingPong.Contract.UpdatePreFundingStatus(&_SelfFundedPingPong.TransactOpts, usePreFunding) +} + func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "updateRouter", newRouter) } @@ -2840,6 +2874,123 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) return event, nil } +type SelfFundedPingPongPreFundingStateUpdatedIterator struct { + Event *SelfFundedPingPongPreFundingStateUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongPreFundingStateUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongPreFundingStateUpdated) + 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(SelfFundedPingPongPreFundingStateUpdated) + 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 *SelfFundedPingPongPreFundingStateUpdatedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongPreFundingStateUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongPreFundingStateUpdated struct { + UsePreFunding bool + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*SelfFundedPingPongPreFundingStateUpdatedIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return &SelfFundedPingPongPreFundingStateUpdatedIterator{contract: _SelfFundedPingPong.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPreFundingStateUpdated) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "PreFundingStateUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongPreFundingStateUpdated) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "PreFundingStateUpdated", 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) ParsePreFundingStateUpdated(log types.Log) (*SelfFundedPingPongPreFundingStateUpdated, error) { + event := new(SelfFundedPingPongPreFundingStateUpdated) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type SelfFundedPingPongTokensWithdrawnByOwnerIterator struct { Event *SelfFundedPingPongTokensWithdrawnByOwner @@ -3018,6 +3169,8 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate return _SelfFundedPingPong.ParsePing(log) case _SelfFundedPingPong.abi.Events["Pong"].ID: return _SelfFundedPingPong.ParsePong(log) + case _SelfFundedPingPong.abi.Events["PreFundingStateUpdated"].ID: + return _SelfFundedPingPong.ParsePreFundingStateUpdated(log) case _SelfFundedPingPong.abi.Events["TokensWithdrawnByOwner"].ID: return _SelfFundedPingPong.ParseTokensWithdrawnByOwner(log) @@ -3094,6 +3247,10 @@ func (SelfFundedPingPongPong) Topic() common.Hash { return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") } +func (SelfFundedPingPongPreFundingStateUpdated) Topic() common.Hash { + return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") +} + func (SelfFundedPingPongTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -3127,6 +3284,8 @@ type SelfFundedPingPongInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) + SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) + TypeAndVersion(opts *bind.CallOpts) (string, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -3159,6 +3318,8 @@ type SelfFundedPingPongInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -3267,6 +3428,12 @@ type SelfFundedPingPongInterface interface { ParsePong(log types.Log) (*SelfFundedPingPongPong, error) + FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*SelfFundedPingPongPreFundingStateUpdatedIterator, error) + + WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPreFundingStateUpdated) (event.Subscription, error) + + ParsePreFundingStateUpdated(log types.Log) (*SelfFundedPingPongPreFundingStateUpdated, error) + FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*SelfFundedPingPongTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 99ac4338d1..a296a4bc2d 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,11 +5,11 @@ 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 fcb85edfc871504a5146db2e3951193c2de089fe491dd7a2fbc755fd92725cac burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 17bcd03828f43f50028bc4d66fdfb0cf576aaf28895d8f86c6ff598159a0cd64 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6f40135e1488097eafa843839a719fe9a3c21354565b64eb377a24a0a55782ef -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin da8d9b35e8972481ff573d93426d51dbcb0fde328eccd2456a59fbea34a701ef -ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 21a99f1044d89a336253f45bc659e1bd531862351a816b56af0525491f8b08c3 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 6478dd770e6bb3f9d4e722373fec0fb6bae3128096841b9333c2bfe07630e044 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 8eba2225b9387475373bb162e065a3e2cac738226727d39ddb8f3b66f5b649b9 -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 2803129cd6282e281395e049fcb01f85b9ad1e82835ad75249431d19b4f818d5 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin feb91496fce66944d6271b92fb6ff796adb64faea5fcb225e167651fa2839408 +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin abff1355e8f0974e995371bfe9f34a47b0882f5efe7a39db0aca56bcdb688778 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 96612451718090a67090a12388702b808f13a99e615c8c0c51d45f3626f19b3e +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 0e233fa128510939f1b8325f6bbeb6b4fd79edd1d9c663a86b12771f25738c3d +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin cf9f78a1cb3873bb76b6c9873c7cc12cd2d5f3a75e4dabc44fd6d53de4254747 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c06c1cf1d004a803585a2c9d7a71ee5997b5fca86c2e111335cb8b930d9e3b5a 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 @@ -29,12 +29,12 @@ 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 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 36a8a376472c27fd0c53ff0b1e681e2acba26d2847a72a3243475d5ea5c40a3d +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 0833089a9c5ab645275dd7c4c73008cd56b8ccfecfe03a574818f0da709aa8a8 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 7b2a47349d3fdb8d8b4e206d68577219deca7fabd1e893686fa8f118ad980d2d report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 897b1ff2115ff7a3deef441bab7f516d3ac05f0d7c633ad1199e23dd0f5731d0 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin b326c2bdfce5f51d66cce542ee2be56cb25c7b63e7fa07d483cd3c04844fcc41 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin a54136ed9bffc74fff830c5066dbfcee6db1f31d636795317267d6baf1e0427a From 7ebb3cfb0c078daeee88b0190eb09084196e76f8 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 17 Jul 2024 17:35:20 -0400 Subject: [PATCH 53/61] modify pre-funding state variable to be immutable --- contracts/gas-snapshots/ccip.gas-snapshot | 38 +++++++++---------- .../ccip/applications/external/CCIPClient.sol | 17 ++------- .../external/CCIPClientWithACK.sol | 14 ++----- .../external/CCIPClientTest.t.sol | 38 ------------------- .../external/CCIPClientWithACKTest.t.sol | 38 ------------------- 5 files changed, 24 insertions(+), 121 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 7f8272e564..6ba99c2a3e 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,18 +34,16 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243552) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_HappyPath_Success() (gas: 192108) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326641) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 219791) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376550) +CCIPClientTest:test_HappyPath_Success() (gas: 192126) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325505) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218611) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376510) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) -CCIPClientTest:test_send_with_preFundedFeeTokens_Success() (gas: 678033) -CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328257) -CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415411) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 347055) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 243275) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 553519) -CCIPClientWithACKTest:test_send_with_preFundedFeeTokens_Success() (gas: 710532) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328213) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415390) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 344990) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241276) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 551936) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -221,7 +219,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181347) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190627) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48050) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 443030) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1599026) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 251770) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 173962) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193657) @@ -247,8 +245,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207379) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26001) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152861) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507480) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2307922) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1663623) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3348111) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209633) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210210) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 668610) @@ -726,10 +724,10 @@ 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: 380130) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 178804) -PingPong_example_plumbing:test_Pausing_Success() (gas: 17923) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 177564) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17877) PingPong_example_plumbing:test_typeAndVersion() (gas: 9741) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 203186) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 201966) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -877,9 +875,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: 268718) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 443986) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20259) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 268720) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444136) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) 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/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 607006ea26..929e9d4702 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -19,14 +19,13 @@ contract CCIPClient is CCIPReceiver { event MessageSent(bytes32 messageId); event FeeTokenUpdated(address oldFeeToken, address newFeeToken); - event PreFundingStateUpdated(bool usePreFunding); - bool public s_shouldUsePreFunding; + bool public immutable i_isPreFunded; /// @dev A check for the zero-address is not explicitly performed since it is included in the CCIPBase parent constructor constructor(address router, IERC20 feeToken, bool usePreFunding) CCIPReceiver(router) { s_feeToken = feeToken; - s_shouldUsePreFunding = usePreFunding; + i_isPreFunded = usePreFunding; if (address(feeToken) != address(0)) { IERC20(s_feeToken).safeApprove(s_ccipRouter, type(uint256).max); @@ -54,11 +53,7 @@ contract CCIPClient is CCIPReceiver { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - // To support pre-funding, if the contract already posesses enough tokens to pay the fee, then a transferFrom is - // not necessary. This branch must be performed before transfering tokens in tokenAmounts[], since in the case - // where tokenAmounts[] contains the fee token, then balanceOf may double count tokens improperly and cause - // unexpected behavior. - if ((address(s_feeToken) != address(0)) && (s_feeToken.balanceOf(address(this)) < fee)) { + if (!i_isPreFunded && address(s_feeToken) != address(0)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } @@ -99,10 +94,4 @@ contract CCIPClient is CCIPReceiver { emit FeeTokenUpdated(oldFeeToken, token); } - - function updatePreFundingStatus(bool usePreFunding) external onlyOwner { - s_shouldUsePreFunding = usePreFunding; - - emit PreFundingStateUpdated(usePreFunding); - } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index ec019105f1..81d6f68f49 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -18,12 +18,10 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { error CannotAcknowledgeUnsentMessage(bytes32); - event PreFundingStateUpdated(bool usePreFunding); - - bool public s_shouldUsePreFunding; + bool public immutable i_isPreFunded; constructor(address router, IERC20 feeToken, bool usePreFunding) CCIPReceiverWithACK(router, feeToken) { - s_shouldUsePreFunding = usePreFunding; + i_isPreFunded = usePreFunding; } /// @notice sends a message through CCIP to the router @@ -58,7 +56,7 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - if (!s_shouldUsePreFunding) { + if (!i_isPreFunded && address(s_feeToken) != address(0)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } @@ -72,10 +70,4 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { return messageId; } - - function updatePreFundingStatus(bool usePreFunding) external onlyOwner { - s_shouldUsePreFunding = usePreFunding; - - emit PreFundingStateUpdated(usePreFunding); - } } 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 fa94e96e73..a19d42771c 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 @@ -168,42 +168,4 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { }) ); } - - function test_send_with_preFundedFeeTokens_Success() public { - // Update pre-funding state - s_sender.updatePreFundingStatus(true); - - assertTrue(s_sender.s_shouldUsePreFunding(), "Pre funding should be enabled instead of disabled"); - - // Deal fee tokens to the contract to pre-fund the message execution - deal(address(s_sourceFeeToken), address(s_sender), 1e24); - - 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); - uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); - - s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); - - // Assert that tokens were transfered for bridging + fees - assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); - assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), feeTokenBalanceBefore - feeTokenAmount); - } } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index c2f9378d99..322cca5d46 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -220,42 +220,4 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); assertEq(IERC20(s_sourceFeeToken).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } - - function test_send_with_preFundedFeeTokens_Success() public { - // Update pre-funding state - s_sender.updatePreFundingStatus(true); - - assertTrue(s_sender.s_shouldUsePreFunding(), "Pre funding should be enabled instead of disabled"); - - // Deal fee tokens to the contract to pre-fund the message execution - deal(address(s_sourceFeeToken), address(s_sender), 1e24); - - 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); - uint256 feeTokenBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); - - s_sender.ccipSend({destChainSelector: DEST_CHAIN_SELECTOR, tokenAmounts: destTokenAmounts, data: ""}); - - // Assert that tokens were transfered for bridging + fees - assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount); - assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_sender)), feeTokenBalanceBefore - feeTokenAmount); - } } From 8d1019b5988752d8ff7c58b0b42610e8c58a1d75 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, 17 Jul 2024 21:43:14 +0000 Subject: [PATCH 54/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 195 +++--------------- .../ccipClientWithACK/ccipClientWithACK.go | 195 +++--------------- .../ping_pong_demo/ping_pong_demo.go | 195 +++--------------- .../self_funded_ping_pong.go | 195 +++--------------- ...rapper-dependency-versions-do-not-edit.txt | 8 +- 5 files changed, 108 insertions(+), 680 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 0186c1177a..2942e46895 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004433380380620044338339810160408190526200003491620005f8565b828033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c0816200015a565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03928316179055600780549185166001600160a81b03199092168217600160a01b85151502179055159050620001515760025460075462000151916001600160a01b03918216911660001962000205565b505050620006ff565b336001600160a01b03821603620001b45760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002835750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200025b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000281919062000647565b155b620002f75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200034f9185916200035416565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003a3906001600160a01b03851690849062000425565b8051909150156200034f5780806020019051810190620003c4919062000661565b6200034f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200043684846000856200043e565b949350505050565b606082471015620004a15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620004bf9190620006ac565b60006040518083038185875af1925050503d8060008114620004fe576040519150601f19603f3d011682016040523d82523d6000602084013e62000503565b606091505b509092509050620005178783838762000522565b979650505050505050565b60608315620005965782516000036200058e576001600160a01b0385163b6200058e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162000436565b620004368383815115620005ad5781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620006ca565b6001600160a01b0381168114620005df57600080fd5b50565b80518015158114620005f357600080fd5b919050565b6000806000606084860312156200060e57600080fd5b83516200061b81620005c9565b60208501519093506200062e81620005c9565b91506200063e60408501620005e2565b90509250925092565b6000602082840312156200065a57600080fd5b5051919050565b6000602082840312156200067457600080fd5b6200067f82620005e2565b9392505050565b60005b83811015620006a357818101518382015260200162000689565b50506000910152565b60008251620006c081846020870162000686565b9190910192915050565b6020815260008251806020840152620006eb81604085016020870162000686565b601f01601f19169190910160400192915050565b613d24806200070f6000396000f3fe60806040526004361061016e5760003560e01c80639fe74e26116100cb578063cf6730f81161007f578063ec4a9a2611610059578063ec4a9a2614610419578063f2fde38b1461044b578063ff2deec31461046b57600080fd5b8063cf6730f8146103b8578063e4ca8754146103d8578063e89b4485146103f857600080fd5b8063c25da3fe116100b0578063c25da3fe14610358578063c851cc3214610378578063c89245d51461039857600080fd5b80639fe74e261461030d578063b0f479a11461032d57600080fd5b80636d62d633116101225780638462a2b9116101075780638462a2b91461028157806385572ffb146102a15780638da5cb5b146102c157600080fd5b80636d62d6331461024c57806379ba50971461026c57600080fd5b806335f170ef1161015357806335f170ef146101cf5780635e35359e146101fd5780636939cd971461021f57600080fd5b80630a9094dc1461017a5780630e958d6b146101af57600080fd5b3661017557005b600080fd5b34801561018657600080fd5b5061019a610195366004612be0565b610498565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b5061019a6101ca366004612c0f565b6104ab565b3480156101db57600080fd5b506101ef6101ea366004612c94565b6104f6565b6040516101a6929190612d1f565b34801561020957600080fd5b5061021d610218366004612d6f565b610622565b005b34801561022b57600080fd5b5061023f61023a366004612be0565b6106f7565b6040516101a69190612e0d565b34801561025857600080fd5b5061021d610267366004612ea1565b610902565b34801561027857600080fd5b5061021d610b19565b34801561028d57600080fd5b5061021d61029c366004612f1d565b610c16565b3480156102ad57600080fd5b5061021d6102bc366004612f89565b610f57565b3480156102cd57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b34801561031957600080fd5b5061021d610328366004612fc4565b611160565b34801561033957600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102e8565b34801561036457600080fd5b5061021d610373366004613014565b611314565b34801561038457600080fd5b5061021d610393366004613031565b6113a0565b3480156103a457600080fd5b5061021d6103b3366004613031565b61146c565b3480156103c457600080fd5b5061021d6103d3366004612f89565b6115d6565b3480156103e457600080fd5b5061021d6103f3366004612be0565b611712565b61040b610406366004613183565b6119e0565b6040519081526020016101a6565b34801561042557600080fd5b5060075461019a9074010000000000000000000000000000000000000000900460ff1681565b34801561045757600080fd5b5061021d610466366004613031565b611f8e565b34801561047757600080fd5b506007546102e89073ffffffffffffffffffffffffffffffffffffffff1681565b60006104a5600583611fa2565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906104da9085908590613290565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610511906132a0565b80601f016020809104026020016040519081016040528092919081815260200182805461053d906132a0565b801561058a5780601f1061055f5761010080835404028352916020019161058a565b820191906000526020600020905b81548152906001019060200180831161056d57829003601f168201915b50505050509080600101805461059f906132a0565b80601f01602080910402602001604051908101604052809291908181526020018280546105cb906132a0565b80156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905082565b61062a611fbd565b73ffffffffffffffffffffffffffffffffffffffff831661066a5761066573ffffffffffffffffffffffffffffffffffffffff831682612040565b61068b565b61068b73ffffffffffffffffffffffffffffffffffffffff8416838361219a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ea91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610766906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906132a0565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b505050505081526020016003820180546107f8906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610824906132a0565b80156108715780601f1061084657610100808354040283529160200191610871565b820191906000526020600020905b81548152906001019060200180831161085457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f45760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161089f565b505050915250909392505050565b61090a611fbd565b610915600583611fa2565b610953576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b828210156109d45760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161097f565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a246002830182612b2e565b610a32600383016000612b2e565b610a40600483016000612b68565b50610a4e905060058461226e565b5060005b8151811015610ac857610ac083838381518110610a7157610a716132f3565b602002602001015160200151848481518110610a8f57610a8f6132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661219a9092919063ffffffff16565b600101610a52565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094a565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c1e611fbd565b60005b81811015610db15760036000848484818110610c3f57610c3f6132f3565b9050602002810190610c519190613322565b610c5f906020810190612c94565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c9657610c966132f3565b9050602002810190610ca89190613322565b610cb6906020810190613360565b604051610cc4929190613290565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d0b57610d0b6132f3565b9050602002810190610d1d9190613322565b610d2b906020810190613360565b604051610d39929190613290565b6040518091039020838383818110610d5357610d536132f3565b9050602002810190610d659190613322565b610d73906020810190612c94565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c21565b5060005b83811015610f5057600160036000878785818110610dd557610dd56132f3565b9050602002810190610de79190613322565b610df5906020810190612c94565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e2c57610e2c6132f3565b9050602002810190610e3e9190613322565b610e4c906020810190613360565b604051610e5a929190613290565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610eaa57610eaa6132f3565b9050602002810190610ebc9190613322565b610eca906020810190613360565b604051610ed8929190613290565b6040518091039020858583818110610ef257610ef26132f3565b9050602002810190610f049190613322565b610f12906020810190612c94565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610db5565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610faa576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094a565b610fba6040820160208301612c94565b67ffffffffffffffff8116600090815260036020526040902080548190610fe0906132a0565b9050600003611027576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094a565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110639086906004016134c7565b600060405180830381600087803b15801561107d57600080fd5b505af192505050801561108e575060015b61112e573d8080156110bc576040519150601f19603f3d011682016040523d82523d6000602084013e6110c1565b606091505b506110ce6005853561227a565b508335600090815260046020526040902084906110eb82826138a1565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061112090849061399b565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b611168611fbd565b60005b8181101561115b576000838383818110611187576111876132f3565b905060200281019061119991906139ae565b6111a2906139e2565b9050806020015161120d57805167ffffffffffffffff1660009081526003602052604081206111d091612b2e565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261130b565b80604001515160000361124c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112779082613a93565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906112a59082613a93565b5080604001516040516112b89190613bad565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128360600151604051611302919061399b565b60405180910390a35b5060010161116b565b61131c611fbd565b6007805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b9061139590831515815260200190565b60405180910390a150565b6113a8611fbd565b73ffffffffffffffffffffffffffffffffffffffff81166113f5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611474611fbd565b60075473ffffffffffffffffffffffffffffffffffffffff16156114d5576114d56114b460025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612286565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115825761158261154260025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612408565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461160f576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61161f6040820160208301612c94565b61162c6040830183613360565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611683925090506132a0565b159050806116d95750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116c49190613bad565b9081526040519081900360200190205460ff16155b1561115b57806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094a919061399b565b61171d600582611fa2565b611756576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094a565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161179d906132a0565b80601f01602080910402602001604051908101604052809291908181526020018280546117c9906132a0565b80156118165780601f106117eb57610100808354040283529160200191611816565b820191906000526020600020905b8154815290600101906020018083116117f957829003601f168201915b5050505050815260200160038201805461182f906132a0565b80601f016020809104026020016040519081016040528092919081815260200182805461185b906132a0565b80156118a85780601f1061187d576101008083540402835291602001916118a8565b820191906000526020600020905b81548152906001019060200180831161188b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561192b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016118d6565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905591925061197d6002830182612b2e565b61198b600383016000612b2e565b611999600483016000612b68565b506119a7905060058361226e565b506119b18161250c565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611a09906132a0565b9050600003611a50576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161094a565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611a80906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac906132a0565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611b5a906132a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611b86906132a0565b8015611bd35780601f10611ba857610100808354040283529160200191611bd3565b820191906000526020600020905b815481529060010190602001808311611bb657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611c3a908b908690600401613bbf565b602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190613c8c565b60075490915073ffffffffffffffffffffffffffffffffffffffff1615801590611d3457506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d329190613c8c565b105b15611d5e57600754611d5e9073ffffffffffffffffffffffffffffffffffffffff1633308461257e565b60005b8751811015611eb157611dd133308a8481518110611d8157611d816132f3565b6020026020010151602001518b8581518110611d9f57611d9f6132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661257e909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611e0157611e016132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611ea9576002548851611ea99173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611e5a57611e5a6132f3565b6020026020010151602001518a8481518110611e7857611e786132f3565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122869092919063ffffffff16565b600101611d61565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611ee4576000611ee6565b825b8a856040518463ffffffff1660e01b8152600401611f05929190613bbf565b60206040518083038185885af1158015611f23573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f489190613c8c565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611f7b91815260200190565b60405180910390a1505050509392505050565b611f96611fbd565b611f9f816125dc565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094a565b565b804710156120aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612104576040519150601f19603f3d011682016040523d82523d6000602084013e612109565b606091505b505090508061115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261115b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526126d1565b6000611fb683836127dd565b6000611fb683836128d0565b80158061232657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123249190613c8c565b155b6123b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161094a565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261115b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016121ec565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190613c8c565b6124ad9190613ca5565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506125069085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016121ec565b50505050565b612514611fbd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612550908490600401612e0d565b600060405180830381600087803b15801561256a57600080fd5b505af1158015610f50573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526125069085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016121ec565b3373ffffffffffffffffffffffffffffffffffffffff82160361265b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612733826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661291f9092919063ffffffff16565b80519091501561115b57808060200190518101906127519190613cb8565b61115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094a565b600081815260018301602052604081205480156128c6576000612801600183613cd5565b855490915060009061281590600190613cd5565b905081811461287a576000866000018281548110612835576128356132f3565b9060005260206000200154905080876000018481548110612858576128586132f3565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061288b5761288b613ce8565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a5565b60009150506104a5565b6000818152600183016020526040812054612917575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a5565b5060006104a5565b606061292e8484600085612936565b949350505050565b6060824710156129c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129f19190613bad565b60006040518083038185875af1925050503d8060008114612a2e576040519150601f19603f3d011682016040523d82523d6000602084013e612a33565b606091505b5091509150612a4487838387612a4f565b979650505050505050565b60608315612ae5578251600003612ade5773ffffffffffffffffffffffffffffffffffffffff85163b612ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094a565b508161292e565b61292e8383815115612afa5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a919061399b565b508054612b3a906132a0565b6000825580601f10612b4a575050565b601f016020900490600052602060002090810190611f9f9190612b89565b5080546000825560020290600052602060002090810190611f9f9190612ba2565b5b80821115612b9e5760008155600101612b8a565b5090565b5b80821115612b9e5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612ba3565b600060208284031215612bf257600080fd5b5035919050565b67ffffffffffffffff81168114611f9f57600080fd5b600080600060408486031215612c2457600080fd5b8335612c2f81612bf9565b9250602084013567ffffffffffffffff80821115612c4c57600080fd5b818601915086601f830112612c6057600080fd5b813581811115612c6f57600080fd5b876020828501011115612c8157600080fd5b6020830194508093505050509250925092565b600060208284031215612ca657600080fd5b8135611fb681612bf9565b60005b83811015612ccc578181015183820152602001612cb4565b50506000910152565b60008151808452612ced816020860160208601612cb1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612d326040830185612cd5565b8281036020840152612d448185612cd5565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611f9f57600080fd5b600080600060608486031215612d8457600080fd5b8335612d8f81612d4d565b92506020840135612d9f81612d4d565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612e02578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612dc5565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612e4760c0840182612cd5565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612e838383612cd5565b925060808601519150808584030160a086015250612d448282612db0565b60008060408385031215612eb457600080fd5b823591506020830135612ec681612d4d565b809150509250929050565b60008083601f840112612ee357600080fd5b50813567ffffffffffffffff811115612efb57600080fd5b6020830191508360208260051b8501011115612f1657600080fd5b9250929050565b60008060008060408587031215612f3357600080fd5b843567ffffffffffffffff80821115612f4b57600080fd5b612f5788838901612ed1565b90965094506020870135915080821115612f7057600080fd5b50612f7d87828801612ed1565b95989497509550505050565b600060208284031215612f9b57600080fd5b813567ffffffffffffffff811115612fb257600080fd5b820160a08185031215611fb657600080fd5b60008060208385031215612fd757600080fd5b823567ffffffffffffffff811115612fee57600080fd5b612ffa85828601612ed1565b90969095509350505050565b8015158114611f9f57600080fd5b60006020828403121561302657600080fd5b8135611fb681613006565b60006020828403121561304357600080fd5b8135611fb681612d4d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156130a0576130a061304e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130ed576130ed61304e565b604052919050565b600082601f83011261310657600080fd5b813567ffffffffffffffff8111156131205761312061304e565b61315160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016130a6565b81815284602083860101111561316657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561319857600080fd5b83356131a381612bf9565b925060208481013567ffffffffffffffff808211156131c157600080fd5b818701915087601f8301126131d557600080fd5b8135818111156131e7576131e761304e565b6131f5848260051b016130a6565b81815260069190911b8301840190848101908a83111561321457600080fd5b938501935b82851015613260576040858c0312156132325760008081fd5b61323a61307d565b853561324581612d4d565b81528587013587820152825260409094019390850190613219565b96505050604087013592508083111561327857600080fd5b5050613286868287016130f5565b9150509250925092565b8183823760009101908152919050565b600181811c908216806132b457607f821691505b6020821081036132ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261335657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261339557600080fd5b83018035915067ffffffffffffffff8211156133b057600080fd5b602001915036819003821315612f1657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126133fa57600080fd5b830160208101925035905067ffffffffffffffff81111561341a57600080fd5b803603821315612f1657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612e0257813561349581612d4d565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613482565b6020815281356020820152600060208301356134e281612bf9565b67ffffffffffffffff808216604085015261350060408601866133c5565b925060a0606086015261351760c086018483613429565b92505061352760608601866133c5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261355d858385613429565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261359657600080fd5b602092880192830192359150838211156135af57600080fd5b8160061b36038313156135c157600080fd5b8685030160a0870152612a44848284613472565b601f82111561115b576000816000526020600020601f850160051c810160208610156135fe5750805b601f850160051c820191505b8181101561361d5782815560010161360a565b505050505050565b67ffffffffffffffff83111561363d5761363d61304e565b6136518361364b83546132a0565b836135d5565b6000601f8411600181146136a3576000851561366d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f50565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156136f257868501358255602094850194600190920191016136d2565b508682101561372d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561377981612d4d565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156137df576137df61304e565b80548382558084101561386c5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146138205761382061373f565b80861686146138315761383161373f565b5060008360005260206000208360011b81018760011b820191505b8082101561386757828255828483015560028201915061384c565b505050505b5060008181526020812083915b8581101561361d5761388b838361376e565b6040929092019160029190910190600101613879565b813581556001810160208301356138b781612bf9565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556138f76040860186613360565b93509150613909838360028701613625565b6139166060860186613360565b93509150613928838360038701613625565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261395f57600080fd5b91840191823591508082111561397457600080fd5b506020820191508060061b360382131561398d57600080fd5b6125068183600486016137c6565b602081526000611fb66020830184612cd5565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261335657600080fd5b6000608082360312156139f457600080fd5b6040516080810167ffffffffffffffff8282108183111715613a1857613a1861304e565b8160405284359150613a2982612bf9565b908252602084013590613a3b82613006565b8160208401526040850135915080821115613a5557600080fd5b613a61368387016130f5565b60408401526060850135915080821115613a7a57600080fd5b50613a87368286016130f5565b60608301525092915050565b815167ffffffffffffffff811115613aad57613aad61304e565b613ac181613abb84546132a0565b846135d5565b602080601f831160018114613b145760008415613ade5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561361d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b6157888601518255948401946001909101908401613b42565b5085821015613b9d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613356818460208701612cb1565b67ffffffffffffffff83168152604060208201526000825160a06040840152613beb60e0840182612cd5565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613c278383612cd5565b92506040860151915080858403016080860152613c448383612db0565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613c828282612cd5565b9695505050505050565b600060208284031215613c9e57600080fd5b5051919050565b808201808211156104a5576104a561373f565b600060208284031215613cca57600080fd5b8151611fb681613006565b818103818111156104a5576104a561373f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b50604051620042f9380380620042f98339810160408190526200003491620005ef565b828033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000151565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600780549286169290911682179055821515608052159050620001485760025460075462000148916001600160a01b039182169116600019620001fc565b505050620006f6565b336001600160a01b03821603620001ab5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200027a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027891906200063e565b155b620002ee5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003469185916200034b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200039a906001600160a01b0385169084906200041c565b805190915015620003465780806020019051810190620003bb919062000658565b620003465760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200042d848460008562000435565b949350505050565b606082471015620004985760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620004b69190620006a3565b60006040518083038185875af1925050503d8060008114620004f5576040519150601f19603f3d011682016040523d82523d6000602084013e620004fa565b606091505b5090925090506200050e8783838762000519565b979650505050505050565b606083156200058d57825160000362000585576001600160a01b0385163b620005855760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200042d565b6200042d8383815115620005a45781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620006c1565b6001600160a01b0381168114620005d657600080fd5b50565b80518015158114620005ea57600080fd5b919050565b6000806000606084860312156200060557600080fd5b83516200061281620005c0565b60208501519093506200062581620005c0565b91506200063560408501620005d9565b90509250925092565b6000602082840312156200065157600080fd5b5051919050565b6000602082840312156200066b57600080fd5b6200067682620005d9565b9392505050565b60005b838110156200069a57818101518382015260200162000680565b50506000910152565b60008251620006b78184602087016200067d565b9190910192915050565b6020815260008251806020840152620006e28160408501602087016200067d565b601f01601f19169190910160400192915050565b608051613be062000719600039600081816102040152611bca0152613be06000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b448514610401578063f2fde38b14610422578063ff2deec31461044257600080fd5b8063cf6730f8146103c1578063e4ca8754146103e157600080fd5b8063b0f479a1116100a5578063b0f479a114610356578063c851cc3214610381578063c89245d5146103a157600080fd5b80638da5cb5b146102ea5780639fe74e261461033657600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba5097146102955780638462a2b9146102aa57806385572ffb146102ca57600080fd5b80636939cd97146102485780636d62d6331461027557600080fd5b806335f170ef1161014857806335f170ef146101c457806353d4f18a146101f25780635e35359e1461022657600080fd5b80630a9094dc1461016f5780630e958d6b146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612ab9565b61046f565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b5061018f6101bf366004612ae8565b610482565b3480156101d057600080fd5b506101e46101df366004612b6d565b6104cd565b60405161019b929190612bf8565b3480156101fe57600080fd5b5061018f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561023257600080fd5b50610246610241366004612c48565b6105f9565b005b34801561025457600080fd5b50610268610263366004612ab9565b6106ce565b60405161019b9190612ce6565b34801561028157600080fd5b50610246610290366004612d7a565b6108d9565b3480156102a157600080fd5b50610246610af0565b3480156102b657600080fd5b506102466102c5366004612df6565b610bed565b3480156102d657600080fd5b506102466102e5366004612e62565b610f2e565b3480156102f657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561034257600080fd5b50610246610351366004612e9d565b611137565b34801561036257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610311565b34801561038d57600080fd5b5061024661039c366004612edf565b6112eb565b3480156103ad57600080fd5b506102466103bc366004612edf565b6113b7565b3480156103cd57600080fd5b506102466103dc366004612e62565b611521565b3480156103ed57600080fd5b506102466103fc366004612ab9565b61165d565b61041461040f366004613031565b61192b565b60405190815260200161019b565b34801561042e57600080fd5b5061024661043d366004612edf565b611e67565b34801561044e57600080fd5b506007546103119073ffffffffffffffffffffffffffffffffffffffff1681565b600061047c600583611e7b565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906104b1908590859061313e565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104e89061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546105149061314e565b80156105615780601f1061053657610100808354040283529160200191610561565b820191906000526020600020905b81548152906001019060200180831161054457829003601f168201915b5050505050908060010180546105769061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546105a29061314e565b80156105ef5780601f106105c4576101008083540402835291602001916105ef565b820191906000526020600020905b8154815290600101906020018083116105d257829003601f168201915b5050505050905082565b610601611e96565b73ffffffffffffffffffffffffffffffffffffffff83166106415761063c73ffffffffffffffffffffffffffffffffffffffff831682611f19565b610662565b61066273ffffffffffffffffffffffffffffffffffffffff84168383612073565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106c191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161073d9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546107699061314e565b80156107b65780601f1061078b576101008083540402835291602001916107b6565b820191906000526020600020905b81548152906001019060200180831161079957829003601f168201915b505050505081526020016003820180546107cf9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb9061314e565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108cb5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610876565b505050915250909392505050565b6108e1611e96565b6108ec600583611e7b565b61092a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b828210156109ab5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610956565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506109fb6002830182612a07565b610a09600383016000612a07565b610a17600483016000612a41565b50610a259050600584612147565b5060005b8151811015610a9f57610a9783838381518110610a4857610a486131a1565b602002602001015160200151848481518110610a6657610a666131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166120739092919063ffffffff16565b600101610a29565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610921565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610bf5611e96565b60005b81811015610d885760036000848484818110610c1657610c166131a1565b9050602002810190610c2891906131d0565b610c36906020810190612b6d565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c6d57610c6d6131a1565b9050602002810190610c7f91906131d0565b610c8d90602081019061320e565b604051610c9b92919061313e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ce257610ce26131a1565b9050602002810190610cf491906131d0565b610d0290602081019061320e565b604051610d1092919061313e565b6040518091039020838383818110610d2a57610d2a6131a1565b9050602002810190610d3c91906131d0565b610d4a906020810190612b6d565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610bf8565b5060005b83811015610f2757600160036000878785818110610dac57610dac6131a1565b9050602002810190610dbe91906131d0565b610dcc906020810190612b6d565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e0357610e036131a1565b9050602002810190610e1591906131d0565b610e2390602081019061320e565b604051610e3192919061313e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610e8157610e816131a1565b9050602002810190610e9391906131d0565b610ea190602081019061320e565b604051610eaf92919061313e565b6040518091039020858583818110610ec957610ec96131a1565b9050602002810190610edb91906131d0565b610ee9906020810190612b6d565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610d8c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610f81576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610921565b610f916040820160208301612b6d565b67ffffffffffffffff8116600090815260036020526040902080548190610fb79061314e565b9050600003610ffe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610921565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061103a908690600401613375565b600060405180830381600087803b15801561105457600080fd5b505af1925050508015611065575060015b611105573d808015611093576040519150601f19603f3d011682016040523d82523d6000602084013e611098565b606091505b506110a560058535612153565b508335600090815260046020526040902084906110c2828261374f565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110f7908490613849565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61113f611e96565b60005b8181101561113257600083838381811061115e5761115e6131a1565b9050602002810190611170919061385c565b6111799061389e565b905080602001516111e457805167ffffffffffffffff1660009081526003602052604081206111a791612a07565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26112e2565b806040015151600003611223576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061124e908261394f565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061127c908261394f565b50806040015160405161128f9190613a69565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516112d99190613849565b60405180910390a35b50600101611142565b6112f3611e96565b73ffffffffffffffffffffffffffffffffffffffff8116611340576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6113bf611e96565b60075473ffffffffffffffffffffffffffffffffffffffff1615611420576114206113ff60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1690600061215f565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156114cd576114cd61148d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122e1565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461155a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156a6040820160208301612b6d565b611577604083018361320e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506115ce9250905061314e565b159050806116245750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161160f9190613a69565b9081526040519081900360200190205460ff16155b1561113257806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109219190613849565b611668600582611e7b565b6116a1576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610921565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916116e89061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546117149061314e565b80156117615780601f1061173657610100808354040283529160200191611761565b820191906000526020600020905b81548152906001019060200180831161174457829003601f168201915b5050505050815260200160038201805461177a9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546117a69061314e565b80156117f35780601f106117c8576101008083540402835291602001916117f3565b820191906000526020600020905b8154815290600101906020018083116117d657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118765760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611821565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506118c86002830182612a07565b6118d6600383016000612a07565b6118e4600483016000612a41565b506118f29050600583612147565b506118fc816123e5565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906119549061314e565b905060000361199b576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610921565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906119cb9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546119f79061314e565b8015611a445780601f10611a1957610100808354040283529160200191611a44565b820191906000526020600020905b815481529060010190602001808311611a2757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611aa59061314e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad19061314e565b8015611b1e5780601f10611af357610100808354040283529160200191611b1e565b820191906000526020600020905b815481529060010190602001808311611b0157829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611b85908b908690600401613a7b565b602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190613b48565b90507f0000000000000000000000000000000000000000000000000000000000000000158015611c0d575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15611c3757600754611c379073ffffffffffffffffffffffffffffffffffffffff16333084612457565b60005b8751811015611d8a57611caa33308a8481518110611c5a57611c5a6131a1565b6020026020010151602001518b8581518110611c7857611c786131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612457909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611cda57611cda6131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611d82576002548851611d829173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611d3357611d336131a1565b6020026020010151602001518a8481518110611d5157611d516131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661215f9092919063ffffffff16565b600101611c3a565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611dbd576000611dbf565b825b8a856040518463ffffffff1660e01b8152600401611dde929190613a7b565b60206040518083038185885af1158015611dfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e219190613b48565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611e5491815260200190565b60405180910390a1505050509392505050565b611e6f611e96565b611e78816124b5565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610921565b565b80471015611f83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610921565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fdd576040519150601f19603f3d011682016040523d82523d6000602084013e611fe2565b606091505b5050905080611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610921565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111329084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125aa565b6000611e8f83836126b6565b6000611e8f83836127a9565b8015806121ff57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fd9190613b48565b155b61228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610921565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111329084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120c5565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237c9190613b48565b6123869190613b61565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506123df9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120c5565b50505050565b6123ed611e96565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612429908490600401612ce6565b600060405180830381600087803b15801561244357600080fd5b505af1158015610f27573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123df9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016120c5565b3373ffffffffffffffffffffffffffffffffffffffff821603612534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610921565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061260c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127f89092919063ffffffff16565b805190915015611132578080602001905181019061262a9190613b74565b611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610921565b6000818152600183016020526040812054801561279f5760006126da600183613b91565b85549091506000906126ee90600190613b91565b905081811461275357600086600001828154811061270e5761270e6131a1565b9060005260206000200154905080876000018481548110612731576127316131a1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061276457612764613ba4565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061047c565b600091505061047c565b60008181526001830160205260408120546127f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561047c565b50600061047c565b6060612807848460008561280f565b949350505050565b6060824710156128a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610921565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128ca9190613a69565b60006040518083038185875af1925050503d8060008114612907576040519150601f19603f3d011682016040523d82523d6000602084013e61290c565b606091505b509150915061291d87838387612928565b979650505050505050565b606083156129be5782516000036129b75773ffffffffffffffffffffffffffffffffffffffff85163b6129b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610921565b5081612807565b61280783838151156129d35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109219190613849565b508054612a139061314e565b6000825580601f10612a23575050565b601f016020900490600052602060002090810190611e789190612a62565b5080546000825560020290600052602060002090810190611e789190612a7b565b5b80821115612a775760008155600101612a63565b5090565b5b80821115612a775780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612a7c565b600060208284031215612acb57600080fd5b5035919050565b67ffffffffffffffff81168114611e7857600080fd5b600080600060408486031215612afd57600080fd5b8335612b0881612ad2565b9250602084013567ffffffffffffffff80821115612b2557600080fd5b818601915086601f830112612b3957600080fd5b813581811115612b4857600080fd5b876020828501011115612b5a57600080fd5b6020830194508093505050509250925092565b600060208284031215612b7f57600080fd5b8135611e8f81612ad2565b60005b83811015612ba5578181015183820152602001612b8d565b50506000910152565b60008151808452612bc6816020860160208601612b8a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612c0b6040830185612bae565b8281036020840152612c1d8185612bae565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e7857600080fd5b600080600060608486031215612c5d57600080fd5b8335612c6881612c26565b92506020840135612c7881612c26565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612cdb578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612c9e565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612d2060c0840182612bae565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d5c8383612bae565b925060808601519150808584030160a086015250612c1d8282612c89565b60008060408385031215612d8d57600080fd5b823591506020830135612d9f81612c26565b809150509250929050565b60008083601f840112612dbc57600080fd5b50813567ffffffffffffffff811115612dd457600080fd5b6020830191508360208260051b8501011115612def57600080fd5b9250929050565b60008060008060408587031215612e0c57600080fd5b843567ffffffffffffffff80821115612e2457600080fd5b612e3088838901612daa565b90965094506020870135915080821115612e4957600080fd5b50612e5687828801612daa565b95989497509550505050565b600060208284031215612e7457600080fd5b813567ffffffffffffffff811115612e8b57600080fd5b820160a08185031215611e8f57600080fd5b60008060208385031215612eb057600080fd5b823567ffffffffffffffff811115612ec757600080fd5b612ed385828601612daa565b90969095509350505050565b600060208284031215612ef157600080fd5b8135611e8f81612c26565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f4e57612f4e612efc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f9b57612f9b612efc565b604052919050565b600082601f830112612fb457600080fd5b813567ffffffffffffffff811115612fce57612fce612efc565b612fff60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f54565b81815284602083860101111561301457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561304657600080fd5b833561305181612ad2565b925060208481013567ffffffffffffffff8082111561306f57600080fd5b818701915087601f83011261308357600080fd5b81358181111561309557613095612efc565b6130a3848260051b01612f54565b81815260069190911b8301840190848101908a8311156130c257600080fd5b938501935b8285101561310e576040858c0312156130e05760008081fd5b6130e8612f2b565b85356130f381612c26565b815285870135878201528252604090940193908501906130c7565b96505050604087013592508083111561312657600080fd5b505061313486828701612fa3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061316257607f821691505b60208210810361319b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261320457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261324357600080fd5b83018035915067ffffffffffffffff82111561325e57600080fd5b602001915036819003821315612def57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132a857600080fd5b830160208101925035905067ffffffffffffffff8111156132c857600080fd5b803603821315612def57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612cdb57813561334381612c26565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613330565b60208152813560208201526000602083013561339081612ad2565b67ffffffffffffffff80821660408501526133ae6040860186613273565b925060a060608601526133c560c0860184836132d7565b9250506133d56060860186613273565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261340b8583856132d7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261344457600080fd5b6020928801928301923591508382111561345d57600080fd5b8160061b360383131561346f57600080fd5b8685030160a087015261291d848284613320565b601f821115611132576000816000526020600020601f850160051c810160208610156134ac5750805b601f850160051c820191505b818110156134cb578281556001016134b8565b505050505050565b67ffffffffffffffff8311156134eb576134eb612efc565b6134ff836134f9835461314e565b83613483565b6000601f841160018114613551576000851561351b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f27565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135a05786850135825560209485019460019092019101613580565b50868210156135db577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561362781612c26565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561368d5761368d612efc565b80548382558084101561371a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146136ce576136ce6135ed565b80861686146136df576136df6135ed565b5060008360005260206000208360011b81018760011b820191505b808210156137155782825582848301556002820191506136fa565b505050505b5060008181526020812083915b858110156134cb57613739838361361c565b6040929092019160029190910190600101613727565b8135815560018101602083013561376581612ad2565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556137a5604086018661320e565b935091506137b78383600287016134d3565b6137c4606086018661320e565b935091506137d68383600387016134d3565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261380d57600080fd5b91840191823591508082111561382257600080fd5b506020820191508060061b360382131561383b57600080fd5b6123df818360048601613674565b602081526000611e8f6020830184612bae565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261320457600080fd5b8015158114611e7857600080fd5b6000608082360312156138b057600080fd5b6040516080810167ffffffffffffffff82821081831117156138d4576138d4612efc565b81604052843591506138e582612ad2565b9082526020840135906138f782613890565b816020840152604085013591508082111561391157600080fd5b61391d36838701612fa3565b6040840152606085013591508082111561393657600080fd5b5061394336828601612fa3565b60608301525092915050565b815167ffffffffffffffff81111561396957613969612efc565b61397d81613977845461314e565b84613483565b602080601f8311600181146139d0576000841561399a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556134cb565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613a1d578886015182559484019460019091019084016139fe565b5085821015613a5957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613204818460208701612b8a565b67ffffffffffffffff83168152604060208201526000825160a06040840152613aa760e0840182612bae565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613ae38383612bae565b92506040860151915080858403016080860152613b008383612c89565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613b3e8282612bae565b9695505050505050565b600060208284031215613b5a57600080fd5b5051919050565b8082018082111561047c5761047c6135ed565b600060208284031215613b8657600080fd5b8151611e8f81613890565b8181038181111561047c5761047c6135ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -240,6 +240,28 @@ func (_CCIPClient *CCIPClientCallerSession) GetRouter() (common.Address, error) return _CCIPClient.Contract.GetRouter(&_CCIPClient.CallOpts) } +func (_CCIPClient *CCIPClientCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "i_isPreFunded") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) IIsPreFunded() (bool, error) { + return _CCIPClient.Contract.IIsPreFunded(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) IIsPreFunded() (bool, error) { + return _CCIPClient.Contract.IIsPreFunded(&_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) @@ -358,28 +380,6 @@ func (_CCIPClient *CCIPClientCallerSession) SFeeToken() (common.Address, error) return _CCIPClient.Contract.SFeeToken(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "s_shouldUsePreFunding") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_CCIPClient *CCIPClientSession) SShouldUsePreFunding() (bool, error) { - return _CCIPClient.Contract.SShouldUsePreFunding(&_CCIPClient.CallOpts) -} - -func (_CCIPClient *CCIPClientCallerSession) SShouldUsePreFunding() (bool, error) { - return _CCIPClient.Contract.SShouldUsePreFunding(&_CCIPClient.CallOpts) -} - func (_CCIPClient *CCIPClientTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -500,18 +500,6 @@ func (_CCIPClient *CCIPClientTransactorSession) UpdateFeeToken(token common.Addr return _CCIPClient.Contract.UpdateFeeToken(&_CCIPClient.TransactOpts, token) } -func (_CCIPClient *CCIPClientTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { - return _CCIPClient.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) -} - -func (_CCIPClient *CCIPClientSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _CCIPClient.Contract.UpdatePreFundingStatus(&_CCIPClient.TransactOpts, usePreFunding) -} - -func (_CCIPClient *CCIPClientTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _CCIPClient.Contract.UpdatePreFundingStatus(&_CCIPClient.TransactOpts, usePreFunding) -} - func (_CCIPClient *CCIPClientTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _CCIPClient.contract.Transact(opts, "updateRouter", newRouter) } @@ -2237,123 +2225,6 @@ func (_CCIPClient *CCIPClientFilterer) ParseOwnershipTransferred(log types.Log) return event, nil } -type CCIPClientPreFundingStateUpdatedIterator struct { - Event *CCIPClientPreFundingStateUpdated - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPClientPreFundingStateUpdatedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPClientPreFundingStateUpdated) - 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(CCIPClientPreFundingStateUpdated) - 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 *CCIPClientPreFundingStateUpdatedIterator) Error() error { - return it.fail -} - -func (it *CCIPClientPreFundingStateUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPClientPreFundingStateUpdated struct { - UsePreFunding bool - Raw types.Log -} - -func (_CCIPClient *CCIPClientFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientPreFundingStateUpdatedIterator, error) { - - logs, sub, err := _CCIPClient.contract.FilterLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return &CCIPClientPreFundingStateUpdatedIterator{contract: _CCIPClient.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil -} - -func (_CCIPClient *CCIPClientFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientPreFundingStateUpdated) (event.Subscription, error) { - - logs, sub, err := _CCIPClient.contract.WatchLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPClientPreFundingStateUpdated) - if err := _CCIPClient.contract.UnpackLog(event, "PreFundingStateUpdated", 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) ParsePreFundingStateUpdated(log types.Log) (*CCIPClientPreFundingStateUpdated, error) { - event := new(CCIPClientPreFundingStateUpdated) - if err := _CCIPClient.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type CCIPClientTokensWithdrawnByOwnerIterator struct { Event *CCIPClientTokensWithdrawnByOwner @@ -2524,8 +2395,6 @@ func (_CCIPClient *CCIPClient) ParseLog(log types.Log) (generated.AbigenLog, err return _CCIPClient.ParseOwnershipTransferRequested(log) case _CCIPClient.abi.Events["OwnershipTransferred"].ID: return _CCIPClient.ParseOwnershipTransferred(log) - case _CCIPClient.abi.Events["PreFundingStateUpdated"].ID: - return _CCIPClient.ParsePreFundingStateUpdated(log) case _CCIPClient.abi.Events["TokensWithdrawnByOwner"].ID: return _CCIPClient.ParseTokensWithdrawnByOwner(log) @@ -2586,10 +2455,6 @@ func (CCIPClientOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } -func (CCIPClientPreFundingStateUpdated) Topic() common.Hash { - return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") -} - func (CCIPClientTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -2603,6 +2468,8 @@ type CCIPClientInterface interface { GetRouter(opts *bind.CallOpts) (common.Address, error) + IIsPreFunded(opts *bind.CallOpts) (bool, error) + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -2615,8 +2482,6 @@ type CCIPClientInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) - SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) - AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) @@ -2637,8 +2502,6 @@ type CCIPClientInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) - UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -2723,12 +2586,6 @@ type CCIPClientInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPClientOwnershipTransferred, error) - FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientPreFundingStateUpdatedIterator, error) - - WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientPreFundingStateUpdated) (event.Subscription, error) - - ParsePreFundingStateUpdated(log types.Log) (*CCIPClientPreFundingStateUpdated, error) - FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go index b869b34798..bbeb32187a 100644 --- a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go +++ b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go @@ -56,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientWithACKMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004a4a38038062004a4a833981016040819052620000349162000591565b8282818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000157565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b0382168360001962000202565b50506009805460ff191691151591909117905550620006c09050565b336001600160a01b03821603620001b15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027a9190620005e0565b620002869190620005fa565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002e291869190620002e816565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000337906001600160a01b038516908490620003be565b805190915015620003b9578080602001905181019062000358919062000622565b620003b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003cf8484600085620003d7565b949350505050565b6060824710156200043a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200045891906200066d565b60006040518083038185875af1925050503d806000811462000497576040519150601f19603f3d011682016040523d82523d6000602084013e6200049c565b606091505b509092509050620004b087838387620004bb565b979650505050505050565b606083156200052f57825160000362000527576001600160a01b0385163b620005275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003cf565b620003cf8383815115620005465781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200068b565b6001600160a01b03811681146200057857600080fd5b50565b805180151581146200058c57600080fd5b919050565b600080600060608486031215620005a757600080fd5b8351620005b48162000562565b6020850151909350620005c78162000562565b9150620005d7604085016200057b565b90509250925092565b600060208284031215620005f357600080fd5b5051919050565b808201808211156200061c57634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200063557600080fd5b62000640826200057b565b9392505050565b60005b83811015620006645781810151838201526020016200064a565b50506000910152565b600082516200068181846020870162000647565b9190910192915050565b6020815260008251806020840152620006ac81604085016020870162000647565b601f01601f19169190910160400192915050565b61437a80620006d06000396000f3fe6080604052600436106101845760003560e01c80638da5cb5b116100d6578063cf6730f81161007f578063ec4a9a2611610059578063ec4a9a26146104a4578063f2fde38b146104be578063ff2deec3146104de57600080fd5b8063cf6730f814610451578063e4ca875414610471578063e89b44851461049157600080fd5b8063c25da3fe116100b0578063c25da3fe146103f1578063c851cc3214610411578063c89245d51461043157600080fd5b80638da5cb5b1461035a5780639fe74e26146103a6578063b0f479a1146103c657600080fd5b80636939cd971161013857806379ba50971161011257806379ba5097146103055780638462a2b91461031a57806385572ffb1461033a57600080fd5b80636939cd97146102765780636d62d633146102a35780636fef519e146102c357600080fd5b80630e958d6b116101695780630e958d6b1461020657806335f170ef146102265780635e35359e1461025457600080fd5b806305bfe982146101905780630a9094dc146101d657600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101c06101ab3660046130d3565b60086020526000908152604090205460ff1681565b6040516101cd919061311b565b60405180910390f35b3480156101e257600080fd5b506101f66101f13660046130d3565b61050b565b60405190151581526020016101cd565b34801561021257600080fd5b506101f6610221366004613172565b61051e565b34801561023257600080fd5b506102466102413660046131f7565b610569565b6040516101cd929190613282565b34801561026057600080fd5b5061027461026f3660046132d2565b610695565b005b34801561028257600080fd5b506102966102913660046130d3565b61076a565b6040516101cd9190613370565b3480156102af57600080fd5b506102746102be366004613404565b610975565b3480156102cf57600080fd5b506102f77f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b281565b6040519081526020016101cd565b34801561031157600080fd5b50610274610b8c565b34801561032657600080fd5b50610274610335366004613480565b610c89565b34801561034657600080fd5b506102746103553660046134ec565b610fca565b34801561036657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b3480156103b257600080fd5b506102746103c1366004613527565b6111d3565b3480156103d257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610381565b3480156103fd57600080fd5b5061027461040c366004613577565b611387565b34801561041d57600080fd5b5061027461042c366004613594565b6113f4565b34801561043d57600080fd5b5061027461044c366004613594565b6114c0565b34801561045d57600080fd5b5061027461046c3660046134ec565b611634565b34801561047d57600080fd5b5061027461048c3660046130d3565b611921565b6102f761049f366004613709565b611bef565b3480156104b057600080fd5b506009546101f69060ff1681565b3480156104ca57600080fd5b506102746104d9366004613594565b612111565b3480156104ea57600080fd5b506007546103819073ffffffffffffffffffffffffffffffffffffffff1681565b6000610518600583612125565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061054d9085908590613816565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061058490613826565b80601f01602080910402602001604051908101604052809291908181526020018280546105b090613826565b80156105fd5780601f106105d2576101008083540402835291602001916105fd565b820191906000526020600020905b8154815290600101906020018083116105e057829003601f168201915b50505050509080600101805461061290613826565b80601f016020809104026020016040519081016040528092919081815260200182805461063e90613826565b801561068b5780601f106106605761010080835404028352916020019161068b565b820191906000526020600020905b81548152906001019060200180831161066e57829003601f168201915b5050505050905082565b61069d612140565b73ffffffffffffffffffffffffffffffffffffffff83166106dd576106d873ffffffffffffffffffffffffffffffffffffffff8316826121c3565b6106fe565b6106fe73ffffffffffffffffffffffffffffffffffffffff8416838361231d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161075d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107d990613826565b80601f016020809104026020016040519081016040528092919081815260200182805461080590613826565b80156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b5050505050815260200160038201805461086b90613826565b80601f016020809104026020016040519081016040528092919081815260200182805461089790613826565b80156108e45780601f106108b9576101008083540402835291602001916108e4565b820191906000526020600020905b8154815290600101906020018083116108c757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109675760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610912565b505050915250909392505050565b61097d612140565b610988600583612125565b6109c6576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a475760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109f2565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a976002830182613021565b610aa5600383016000613021565b610ab360048301600061305b565b50610ac190506005846123f1565b5060005b8151811015610b3b57610b3383838381518110610ae457610ae4613879565b602002602001015160200151848481518110610b0257610b02613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661231d9092919063ffffffff16565b600101610ac5565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109bd565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c91612140565b60005b81811015610e245760036000848484818110610cb257610cb2613879565b9050602002810190610cc491906138a8565b610cd29060208101906131f7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610d0957610d09613879565b9050602002810190610d1b91906138a8565b610d299060208101906138e6565b604051610d37929190613816565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d7e57610d7e613879565b9050602002810190610d9091906138a8565b610d9e9060208101906138e6565b604051610dac929190613816565b6040518091039020838383818110610dc657610dc6613879565b9050602002810190610dd891906138a8565b610de69060208101906131f7565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c94565b5060005b83811015610fc357600160036000878785818110610e4857610e48613879565b9050602002810190610e5a91906138a8565b610e689060208101906131f7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e9f57610e9f613879565b9050602002810190610eb191906138a8565b610ebf9060208101906138e6565b604051610ecd929190613816565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f1d57610f1d613879565b9050602002810190610f2f91906138a8565b610f3d9060208101906138e6565b604051610f4b929190613816565b6040518091039020858583818110610f6557610f65613879565b9050602002810190610f7791906138a8565b610f859060208101906131f7565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e28565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461101d576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b61102d60408201602083016131f7565b67ffffffffffffffff811660009081526003602052604090208054819061105390613826565b905060000361109a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109bd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110d6908690600401613a4d565b600060405180830381600087803b1580156110f057600080fd5b505af1925050508015611101575060015b6111a1573d80801561112f576040519150601f19603f3d011682016040523d82523d6000602084013e611134565b606091505b50611141600585356123fd565b5083356000908152600460205260409020849061115e8282613e27565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611193908490613f21565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111db612140565b60005b818110156111ce5760008383838181106111fa576111fa613879565b905060200281019061120c9190613f34565b61121590613f68565b9050806020015161128057805167ffffffffffffffff16600090815260036020526040812061124391613021565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261137e565b8060400151516000036112bf576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112ea9082614019565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906113189082614019565b50806040015160405161132b9190614133565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516113759190613f21565b60405180910390a35b506001016111de565b61138f612140565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b9060200160405180910390a150565b6113fc612140565b73ffffffffffffffffffffffffffffffffffffffff8116611449576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6114c8612140565b60075473ffffffffffffffffffffffffffffffffffffffff16156115295761152961150860025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612409565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115d6576115d661159660025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b33301461166d576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167d60408201602083016131f7565b61168a60408301836138e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506116e192509050613826565b159050806117375750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516117229190614133565b9081526040519081900360200190205460ff16155b1561177057806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109bd9190613f21565b600061177f60608501856138e6565b81019061178c9190614145565b90506000816040015160018111156117a6576117a66130ec565b036117ba576117b484612689565b50505050565b6001816040015160018111156117d2576117d26130ec565b036117b45760008082602001518060200190518101906117f291906141f1565b915091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b2821461184f576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff166002811115611874576118746130ec565b036118ae576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109bd565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b61192c600582612125565b611965576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109bd565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916119ac90613826565b80601f01602080910402602001604051908101604052809291908181526020018280546119d890613826565b8015611a255780601f106119fa57610100808354040283529160200191611a25565b820191906000526020600020905b815481529060010190602001808311611a0857829003601f168201915b50505050508152602001600382018054611a3e90613826565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6a90613826565b8015611ab75780601f10611a8c57610100808354040283529160200191611ab7565b820191906000526020600020905b815481529060010190602001808311611a9a57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611b3a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611ae5565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b8c6002830182613021565b611b9a600383016000613021565b611ba860048301600061305b565b50611bb690506005836123f1565b50611bc0816129ff565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611c1890613826565b9050600003611c5f576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109bd565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611c8f90613826565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbb90613826565b8015611d085780601f10611cdd57610100808354040283529160200191611d08565b820191906000526020600020905b815481529060010190602001808311611ceb57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611d6990613826565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9590613826565b8015611de25780601f10611db757610100808354040283529160200191611de2565b820191906000526020600020905b815481529060010190602001808311611dc557829003601f168201915b5050505050815250905060005b8651811015611f3f57611e5f3330898481518110611e0f57611e0f613879565b6020026020010151602001518a8581518110611e2d57611e2d613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a71909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611e8f57611e8f613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611f37576002548751611f379173ffffffffffffffffffffffffffffffffffffffff1690899084908110611ee857611ee8613879565b602002602001015160200151898481518110611f0657611f06613879565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166124099092919063ffffffff16565b600101611def565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611f99908b908690600401614215565b602060405180830381865afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fda91906142e2565b60095490915060ff1661200c5760075461200c9073ffffffffffffffffffffffffffffffffffffffff16333084612a71565b60025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561203e576000612040565b825b8a856040518463ffffffff1660e01b815260040161205f929190614215565b60206040518083038185885af115801561207d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120a291906142e2565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b612119612140565b61212281612acf565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109bd565b565b8047101561222d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109bd565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612287576040519150601f19603f3d011682016040523d82523d6000602084013e61228c565b606091505b50509050806111ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109bd565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111ce9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612bc4565b60006121398383612cd0565b60006121398383612dc3565b8015806124a957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a791906142e2565b155b612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109bd565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111ce9084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161236f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262691906142e2565b61263091906142fb565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117b49085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161236f565b60006040518060a001604052808380604001906126a691906138e6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060405160209182019161271e917f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b29187359101918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561279857816020015b60408051808201909152600080825260208201528152602001906001900390816127715790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040918201916003916000916127d8919088019088016131f7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461280890613826565b80601f016020809104026020016040519081016040528092919081815260200182805461283490613826565b80156128815780601f1061285657610100808354040283529160200191612881565b820191906000526020600020905b81548152906001019060200180831161286457829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded6128be60408601602087016131f7565b846040518363ffffffff1660e01b81526004016128dc929190614215565b602060405180830381865afa1580156128f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291d91906142e2565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612955576000612957565b835b61296760408801602089016131f7565b866040518463ffffffff1660e01b8152600401612985929190614215565b60206040518083038185885af11580156129a3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129c891906142e2565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b612a07612140565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612a43908490600401613370565b600060405180830381600087803b158015612a5d57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117b49085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161236f565b3373ffffffffffffffffffffffffffffffffffffffff821603612b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109bd565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612c26826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e129092919063ffffffff16565b8051909150156111ce5780806020019051810190612c44919061430e565b6111ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109bd565b60008181526001830160205260408120548015612db9576000612cf460018361432b565b8554909150600090612d089060019061432b565b9050818114612d6d576000866000018281548110612d2857612d28613879565b9060005260206000200154905080876000018481548110612d4b57612d4b613879565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d7e57612d7e61433e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610518565b6000915050610518565b6000818152600183016020526040812054612e0a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610518565b506000610518565b6060612e218484600085612e29565b949350505050565b606082471015612ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109bd565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ee49190614133565b60006040518083038185875af1925050503d8060008114612f21576040519150601f19603f3d011682016040523d82523d6000602084013e612f26565b606091505b5091509150612f3787838387612f42565b979650505050505050565b60608315612fd8578251600003612fd15773ffffffffffffffffffffffffffffffffffffffff85163b612fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109bd565b5081612e21565b612e218383815115612fed5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd9190613f21565b50805461302d90613826565b6000825580601f1061303d575050565b601f016020900490600052602060002090810190612122919061307c565b50805460008255600202906000526020600020908101906121229190613095565b5b80821115613091576000815560010161307d565b5090565b5b808211156130915780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613096565b6000602082840312156130e557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613156577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff8116811461212257600080fd5b60008060006040848603121561318757600080fd5b83356131928161315c565b9250602084013567ffffffffffffffff808211156131af57600080fd5b818601915086601f8301126131c357600080fd5b8135818111156131d257600080fd5b8760208285010111156131e457600080fd5b6020830194508093505050509250925092565b60006020828403121561320957600080fd5b81356121398161315c565b60005b8381101561322f578181015183820152602001613217565b50506000910152565b60008151808452613250816020860160208601613214565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006132956040830185613238565b82810360208401526132a78185613238565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461212257600080fd5b6000806000606084860312156132e757600080fd5b83356132f2816132b0565b92506020840135613302816132b0565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613365578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613328565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526133aa60c0840182613238565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133e68383613238565b925060808601519150808584030160a0860152506132a78282613313565b6000806040838503121561341757600080fd5b823591506020830135613429816132b0565b809150509250929050565b60008083601f84011261344657600080fd5b50813567ffffffffffffffff81111561345e57600080fd5b6020830191508360208260051b850101111561347957600080fd5b9250929050565b6000806000806040858703121561349657600080fd5b843567ffffffffffffffff808211156134ae57600080fd5b6134ba88838901613434565b909650945060208701359150808211156134d357600080fd5b506134e087828801613434565b95989497509550505050565b6000602082840312156134fe57600080fd5b813567ffffffffffffffff81111561351557600080fd5b820160a0818503121561213957600080fd5b6000806020838503121561353a57600080fd5b823567ffffffffffffffff81111561355157600080fd5b61355d85828601613434565b90969095509350505050565b801515811461212257600080fd5b60006020828403121561358957600080fd5b813561213981613569565b6000602082840312156135a657600080fd5b8135612139816132b0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613603576136036135b1565b60405290565b6040516060810167ffffffffffffffff81118282101715613603576136036135b1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613673576136736135b1565b604052919050565b600082601f83011261368c57600080fd5b813567ffffffffffffffff8111156136a6576136a66135b1565b6136d760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161362c565b8181528460208386010111156136ec57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561371e57600080fd5b83356137298161315c565b925060208481013567ffffffffffffffff8082111561374757600080fd5b818701915087601f83011261375b57600080fd5b81358181111561376d5761376d6135b1565b61377b848260051b0161362c565b81815260069190911b8301840190848101908a83111561379a57600080fd5b938501935b828510156137e6576040858c0312156137b85760008081fd5b6137c06135e0565b85356137cb816132b0565b8152858701358782015282526040909401939085019061379f565b9650505060408701359250808311156137fe57600080fd5b505061380c8682870161367b565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061383a57607f821691505b602082108103613873577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126138dc57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261391b57600080fd5b83018035915067ffffffffffffffff82111561393657600080fd5b60200191503681900382131561347957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261398057600080fd5b830160208101925035905067ffffffffffffffff8111156139a057600080fd5b80360382131561347957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015613365578135613a1b816132b0565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613a08565b602081528135602082015260006020830135613a688161315c565b67ffffffffffffffff8082166040850152613a86604086018661394b565b925060a06060860152613a9d60c0860184836139af565b925050613aad606086018661394b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613ae38583856139af565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613b1c57600080fd5b60209288019283019235915083821115613b3557600080fd5b8160061b3603831315613b4757600080fd5b8685030160a0870152612f378482846139f8565b601f8211156111ce576000816000526020600020601f850160051c81016020861015613b845750805b601f850160051c820191505b81811015613ba357828155600101613b90565b505050505050565b67ffffffffffffffff831115613bc357613bc36135b1565b613bd783613bd18354613826565b83613b5b565b6000601f841160018114613c295760008515613bf35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fc3565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613c785786850135825560209485019460019092019101613c58565b5086821015613cb3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613cff816132b0565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613d6557613d656135b1565b805483825580841015613df25760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613da657613da6613cc5565b8086168614613db757613db7613cc5565b5060008360005260206000208360011b81018760011b820191505b80821015613ded578282558284830155600282019150613dd2565b505050505b5060008181526020812083915b85811015613ba357613e118383613cf4565b6040929092019160029190910190600101613dff565b81358155600181016020830135613e3d8161315c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613e7d60408601866138e6565b93509150613e8f838360028701613bab565b613e9c60608601866138e6565b93509150613eae838360038701613bab565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613ee557600080fd5b918401918235915080821115613efa57600080fd5b506020820191508060061b3603821315613f1357600080fd5b6117b4818360048601613d4c565b6020815260006121396020830184613238565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126138dc57600080fd5b600060808236031215613f7a57600080fd5b6040516080810167ffffffffffffffff8282108183111715613f9e57613f9e6135b1565b8160405284359150613faf8261315c565b908252602084013590613fc182613569565b8160208401526040850135915080821115613fdb57600080fd5b613fe73683870161367b565b6040840152606085013591508082111561400057600080fd5b5061400d3682860161367b565b60608301525092915050565b815167ffffffffffffffff811115614033576140336135b1565b614047816140418454613826565b84613b5b565b602080601f83116001811461409a57600084156140645750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ba3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140e7578886015182559484019460019091019084016140c8565b508582101561412357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516138dc818460208701613214565b60006020828403121561415757600080fd5b813567ffffffffffffffff8082111561416f57600080fd5b908301906060828603121561418357600080fd5b61418b613609565b82358281111561419a57600080fd5b6141a68782860161367b565b8252506020830135828111156141bb57600080fd5b6141c78782860161367b565b60208301525060408301359250600283106141e157600080fd5b6040810192909252509392505050565b6000806040838503121561420457600080fd5b505080516020909101519092909150565b67ffffffffffffffff83168152604060208201526000825160a0604084015261424160e0840182613238565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261427d8383613238565b9250604086015191508085840301608086015261429a8383613313565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506142d88282613238565b9695505050505050565b6000602082840312156142f457600080fd5b5051919050565b8082018082111561051857610518613cc5565b60006020828403121561432057600080fd5b815161213981613569565b8181038181111561051857610518613cc5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b50604051620049f5380380620049f5833981016040819052620000349162000585565b8282818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200014b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f6565b5050151560805250620006b49050565b336001600160a01b03821603620001a55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000248573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026e9190620005d4565b6200027a9190620005ee565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d691869190620002dc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032b906001600160a01b038516908490620003b2565b805190915015620003ad57808060200190518101906200034c919062000616565b620003ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003c38484600085620003cb565b949350505050565b6060824710156200042e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044c919062000661565b60006040518083038185875af1925050503d80600081146200048b576040519150601f19603f3d011682016040523d82523d6000602084013e62000490565b606091505b509092509050620004a487838387620004af565b979650505050505050565b60608315620005235782516000036200051b576001600160a01b0385163b6200051b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003c3565b620003c383838151156200053a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200067f565b6001600160a01b03811681146200056c57600080fd5b50565b805180151581146200058057600080fd5b919050565b6000806000606084860312156200059b57600080fd5b8351620005a88162000556565b6020850151909350620005bb8162000556565b9150620005cb604085016200056f565b90509250925092565b600060208284031215620005e757600080fd5b5051919050565b808201808211156200061057634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200062957600080fd5b62000634826200056f565b9392505050565b60005b83811015620006585781810151838201526020016200063e565b50506000910152565b60008251620006758184602087016200063b565b9190910192915050565b6020815260008251806020840152620006a08160408501602087016200063b565b601f01601f19169190910160400192915050565b60805161431e620006d76000396000818161025b0152611f60015261431e6000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b44851461049a578063f2fde38b146104ad578063ff2deec3146104cd57600080fd5b8063c89245d51461043a578063cf6730f81461045a578063e4ca87541461047a57600080fd5b80639fe74e26116100b05780639fe74e26146103cf578063b0f479a1146103ef578063c851cc321461041a57600080fd5b806385572ffb146103635780638da5cb5b1461038357600080fd5b80635e35359e1161012d5780636fef519e116101075780636fef519e146102ec57806379ba50971461032e5780638462a2b91461034357600080fd5b80635e35359e1461027d5780636939cd971461029f5780636d62d633146102cc57600080fd5b80630e958d6b1161015e5780630e958d6b146101fb57806335f170ef1461021b57806353d4f18a1461024957600080fd5b806305bfe982146101855780630a9094dc146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a0366004613094565b60086020526000908152604090205460ff1681565b6040516101c291906130dc565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613094565b6104fa565b60405190151581526020016101c2565b34801561020757600080fd5b506101eb610216366004613133565b61050d565b34801561022757600080fd5b5061023b6102363660046131b8565b610558565b6040516101c2929190613243565b34801561025557600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561028957600080fd5b5061029d610298366004613293565b610684565b005b3480156102ab57600080fd5b506102bf6102ba366004613094565b610759565b6040516101c29190613331565b3480156102d857600080fd5b5061029d6102e73660046133c5565b610964565b3480156102f857600080fd5b506103207f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b281565b6040519081526020016101c2565b34801561033a57600080fd5b5061029d610b7b565b34801561034f57600080fd5b5061029d61035e366004613441565b610c78565b34801561036f57600080fd5b5061029d61037e3660046134ad565b610fb9565b34801561038f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103db57600080fd5b5061029d6103ea3660046134e8565b6111c2565b3480156103fb57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103aa565b34801561042657600080fd5b5061029d61043536600461352a565b611376565b34801561044657600080fd5b5061029d61045536600461352a565b611442565b34801561046657600080fd5b5061029d6104753660046134ad565b6115b6565b34801561048657600080fd5b5061029d610495366004613094565b6118a3565b6103206104a836600461369f565b611b71565b3480156104b957600080fd5b5061029d6104c836600461352a565b6120d2565b3480156104d957600080fd5b506007546103aa9073ffffffffffffffffffffffffffffffffffffffff1681565b60006105076005836120e6565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061053c90859085906137ac565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610573906137bc565b80601f016020809104026020016040519081016040528092919081815260200182805461059f906137bc565b80156105ec5780601f106105c1576101008083540402835291602001916105ec565b820191906000526020600020905b8154815290600101906020018083116105cf57829003601f168201915b505050505090806001018054610601906137bc565b80601f016020809104026020016040519081016040528092919081815260200182805461062d906137bc565b801561067a5780601f1061064f5761010080835404028352916020019161067a565b820191906000526020600020905b81548152906001019060200180831161065d57829003601f168201915b5050505050905082565b61068c612101565b73ffffffffffffffffffffffffffffffffffffffff83166106cc576106c773ffffffffffffffffffffffffffffffffffffffff831682612184565b6106ed565b6106ed73ffffffffffffffffffffffffffffffffffffffff841683836122de565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161074c91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107c8906137bc565b80601f01602080910402602001604051908101604052809291908181526020018280546107f4906137bc565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050815260200160038201805461085a906137bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610886906137bc565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109565760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610901565b505050915250909392505050565b61096c612101565b6109776005836120e6565b6109b5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a365760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109e1565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a866002830182612fe2565b610a94600383016000612fe2565b610aa260048301600061301c565b50610ab090506005846123b2565b5060005b8151811015610b2a57610b2283838381518110610ad357610ad361380f565b602002602001015160200151848481518110610af157610af161380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122de9092919063ffffffff16565b600101610ab4565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109ac565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c80612101565b60005b81811015610e135760036000848484818110610ca157610ca161380f565b9050602002810190610cb3919061383e565b610cc19060208101906131b8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610cf857610cf861380f565b9050602002810190610d0a919061383e565b610d1890602081019061387c565b604051610d269291906137ac565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d6d57610d6d61380f565b9050602002810190610d7f919061383e565b610d8d90602081019061387c565b604051610d9b9291906137ac565b6040518091039020838383818110610db557610db561380f565b9050602002810190610dc7919061383e565b610dd59060208101906131b8565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c83565b5060005b83811015610fb257600160036000878785818110610e3757610e3761380f565b9050602002810190610e49919061383e565b610e579060208101906131b8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e8e57610e8e61380f565b9050602002810190610ea0919061383e565b610eae90602081019061387c565b604051610ebc9291906137ac565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f0c57610f0c61380f565b9050602002810190610f1e919061383e565b610f2c90602081019061387c565b604051610f3a9291906137ac565b6040518091039020858583818110610f5457610f5461380f565b9050602002810190610f66919061383e565b610f749060208101906131b8565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e17565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461100c576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109ac565b61101c60408201602083016131b8565b67ffffffffffffffff8116600090815260036020526040902080548190611042906137bc565b9050600003611089576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109ac565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110c59086906004016139e3565b600060405180830381600087803b1580156110df57600080fd5b505af19250505080156110f0575060015b611190573d80801561111e576040519150601f19603f3d011682016040523d82523d6000602084013e611123565b606091505b50611130600585356123be565b5083356000908152600460205260409020849061114d8282613dbd565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611182908490613eb7565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111ca612101565b60005b818110156111bd5760008383838181106111e9576111e961380f565b90506020028101906111fb9190613eca565b61120490613f0c565b9050806020015161126f57805167ffffffffffffffff16600090815260036020526040812061123291612fe2565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261136d565b8060400151516000036112ae576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112d99082613fbd565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906113079082613fbd565b50806040015160405161131a91906140d7565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516113649190613eb7565b60405180910390a35b506001016111cd565b61137e612101565b73ffffffffffffffffffffffffffffffffffffffff81166113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61144a612101565b60075473ffffffffffffffffffffffffffffffffffffffff16156114ab576114ab61148a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006123ca565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115585761155861151860025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61254c565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146115ef576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ff60408201602083016131b8565b61160c604083018361387c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611663925090506137bc565b159050806116b95750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116a491906140d7565b9081526040519081900360200190205460ff16155b156116f257806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109ac9190613eb7565b6000611701606085018561387c565b81019061170e91906140e9565b9050600081604001516001811115611728576117286130ad565b0361173c576117368461264a565b50505050565b600181604001516001811115611754576117546130ad565b036117365760008082602001518060200190518101906117749190614195565b915091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b282146117d1576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff1660028111156117f6576117f66130ad565b03611830576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109ac565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b6118ae6005826120e6565b6118e7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109ac565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161192e906137bc565b80601f016020809104026020016040519081016040528092919081815260200182805461195a906137bc565b80156119a75780601f1061197c576101008083540402835291602001916119a7565b820191906000526020600020905b81548152906001019060200180831161198a57829003601f168201915b505050505081526020016003820180546119c0906137bc565b80601f01602080910402602001604051908101604052809291908181526020018280546119ec906137bc565b8015611a395780601f10611a0e57610100808354040283529160200191611a39565b820191906000526020600020905b815481529060010190602001808311611a1c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611abc5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611a67565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b0e6002830182612fe2565b611b1c600383016000612fe2565b611b2a60048301600061301c565b50611b3890506005836123b2565b50611b42816129c0565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611b9a906137bc565b9050600003611be1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109ac565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611c11906137bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3d906137bc565b8015611c8a5780601f10611c5f57610100808354040283529160200191611c8a565b820191906000526020600020905b815481529060010190602001808311611c6d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ceb906137bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611d17906137bc565b8015611d645780601f10611d3957610100808354040283529160200191611d64565b820191906000526020600020905b815481529060010190602001808311611d4757829003601f168201915b5050505050815250905060005b8651811015611ec157611de13330898481518110611d9157611d9161380f565b6020026020010151602001518a8581518110611daf57611daf61380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a32909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611e1157611e1161380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611eb9576002548751611eb99173ffffffffffffffffffffffffffffffffffffffff1690899084908110611e6a57611e6a61380f565b602002602001015160200151898481518110611e8857611e8861380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123ca9092919063ffffffff16565b600101611d71565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611f1b908b9086906004016141b9565b602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c9190614286565b90507f0000000000000000000000000000000000000000000000000000000000000000158015611fa3575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15611fcd57600754611fcd9073ffffffffffffffffffffffffffffffffffffffff16333084612a32565b60025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611fff576000612001565b825b8a856040518463ffffffff1660e01b81526004016120209291906141b9565b60206040518083038185885af115801561203e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120639190614286565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6120da612101565b6120e381612a90565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109ac565b565b804710156121ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ac565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612248576040519150601f19603f3d011682016040523d82523d6000602084013e61224d565b606091505b50509050806111bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ac565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111bd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b85565b60006120fa8383612c91565b60006120fa8383612d84565b80158061246a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124689190614286565b155b6124f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109ac565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111bd9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612330565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e79190614286565b6125f1919061429f565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117369085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612330565b60006040518060a00160405280838060400190612667919061387c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040516020918201916126df917f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b29187359101918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561275957816020015b60408051808201909152600080825260208201528152602001906001900390816127325790505b50815260075473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604091820191600391600091612799919088019088016131b8565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546127c9906137bc565b80601f01602080910402602001604051908101604052809291908181526020018280546127f5906137bc565b80156128425780601f1061281757610100808354040283529160200191612842565b820191906000526020600020905b81548152906001019060200180831161282557829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded61287f60408601602087016131b8565b846040518363ffffffff1660e01b815260040161289d9291906141b9565b602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de9190614286565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612916576000612918565b835b61292860408801602089016131b8565b866040518463ffffffff1660e01b81526004016129469291906141b9565b60206040518083038185885af1158015612964573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129899190614286565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b6129c8612101565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612a04908490600401613331565b600060405180830381600087803b158015612a1e57600080fd5b505af1158015610fb2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117369085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612330565b3373ffffffffffffffffffffffffffffffffffffffff821603612b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109ac565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612be7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612dd39092919063ffffffff16565b8051909150156111bd5780806020019051810190612c0591906142b2565b6111bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109ac565b60008181526001830160205260408120548015612d7a576000612cb56001836142cf565b8554909150600090612cc9906001906142cf565b9050818114612d2e576000866000018281548110612ce957612ce961380f565b9060005260206000200154905080876000018481548110612d0c57612d0c61380f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d3f57612d3f6142e2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610507565b6000915050610507565b6000818152600183016020526040812054612dcb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610507565b506000610507565b6060612de28484600085612dea565b949350505050565b606082471015612e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109ac565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ea591906140d7565b60006040518083038185875af1925050503d8060008114612ee2576040519150601f19603f3d011682016040523d82523d6000602084013e612ee7565b606091505b5091509150612ef887838387612f03565b979650505050505050565b60608315612f99578251600003612f925773ffffffffffffffffffffffffffffffffffffffff85163b612f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ac565b5081612de2565b612de28383815115612fae5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ac9190613eb7565b508054612fee906137bc565b6000825580601f10612ffe575050565b601f0160209004906000526020600020908101906120e3919061303d565b50805460008255600202906000526020600020908101906120e39190613056565b5b80821115613052576000815560010161303e565b5090565b5b808211156130525780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613057565b6000602082840312156130a657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613117577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146120e357600080fd5b60008060006040848603121561314857600080fd5b83356131538161311d565b9250602084013567ffffffffffffffff8082111561317057600080fd5b818601915086601f83011261318457600080fd5b81358181111561319357600080fd5b8760208285010111156131a557600080fd5b6020830194508093505050509250925092565b6000602082840312156131ca57600080fd5b81356120fa8161311d565b60005b838110156131f05781810151838201526020016131d8565b50506000910152565b600081518084526132118160208601602086016131d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061325660408301856131f9565b828103602084015261326881856131f9565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146120e357600080fd5b6000806000606084860312156132a857600080fd5b83356132b381613271565b925060208401356132c381613271565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613326578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016132e9565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261336b60c08401826131f9565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133a783836131f9565b925060808601519150808584030160a08601525061326882826132d4565b600080604083850312156133d857600080fd5b8235915060208301356133ea81613271565b809150509250929050565b60008083601f84011261340757600080fd5b50813567ffffffffffffffff81111561341f57600080fd5b6020830191508360208260051b850101111561343a57600080fd5b9250929050565b6000806000806040858703121561345757600080fd5b843567ffffffffffffffff8082111561346f57600080fd5b61347b888389016133f5565b9096509450602087013591508082111561349457600080fd5b506134a1878288016133f5565b95989497509550505050565b6000602082840312156134bf57600080fd5b813567ffffffffffffffff8111156134d657600080fd5b820160a081850312156120fa57600080fd5b600080602083850312156134fb57600080fd5b823567ffffffffffffffff81111561351257600080fd5b61351e858286016133f5565b90969095509350505050565b60006020828403121561353c57600080fd5b81356120fa81613271565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561359957613599613547565b60405290565b6040516060810167ffffffffffffffff8111828210171561359957613599613547565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561360957613609613547565b604052919050565b600082601f83011261362257600080fd5b813567ffffffffffffffff81111561363c5761363c613547565b61366d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016135c2565b81815284602083860101111561368257600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156136b457600080fd5b83356136bf8161311d565b925060208481013567ffffffffffffffff808211156136dd57600080fd5b818701915087601f8301126136f157600080fd5b81358181111561370357613703613547565b613711848260051b016135c2565b81815260069190911b8301840190848101908a83111561373057600080fd5b938501935b8285101561377c576040858c03121561374e5760008081fd5b613756613576565b853561376181613271565b81528587013587820152825260409094019390850190613735565b96505050604087013592508083111561379457600080fd5b50506137a286828701613611565b9150509250925092565b8183823760009101908152919050565b600181811c908216806137d057607f821691505b602082108103613809577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261387257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138b157600080fd5b83018035915067ffffffffffffffff8211156138cc57600080fd5b60200191503681900382131561343a57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261391657600080fd5b830160208101925035905067ffffffffffffffff81111561393657600080fd5b80360382131561343a57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133265781356139b181613271565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161399e565b6020815281356020820152600060208301356139fe8161311d565b67ffffffffffffffff8082166040850152613a1c60408601866138e1565b925060a06060860152613a3360c086018483613945565b925050613a4360608601866138e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a79858385613945565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613ab257600080fd5b60209288019283019235915083821115613acb57600080fd5b8160061b3603831315613add57600080fd5b8685030160a0870152612ef884828461398e565b601f8211156111bd576000816000526020600020601f850160051c81016020861015613b1a5750805b601f850160051c820191505b81811015613b3957828155600101613b26565b505050505050565b67ffffffffffffffff831115613b5957613b59613547565b613b6d83613b6783546137bc565b83613af1565b6000601f841160018114613bbf5760008515613b895750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fb2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613c0e5786850135825560209485019460019092019101613bee565b5086821015613c49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c9581613271565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613cfb57613cfb613547565b805483825580841015613d885760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613d3c57613d3c613c5b565b8086168614613d4d57613d4d613c5b565b5060008360005260206000208360011b81018760011b820191505b80821015613d83578282558284830155600282019150613d68565b505050505b5060008181526020812083915b85811015613b3957613da78383613c8a565b6040929092019160029190910190600101613d95565b81358155600181016020830135613dd38161311d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613e13604086018661387c565b93509150613e25838360028701613b41565b613e32606086018661387c565b93509150613e44838360038701613b41565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e7b57600080fd5b918401918235915080821115613e9057600080fd5b506020820191508060061b3603821315613ea957600080fd5b611736818360048601613ce2565b6020815260006120fa60208301846131f9565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261387257600080fd5b80151581146120e357600080fd5b600060808236031215613f1e57600080fd5b6040516080810167ffffffffffffffff8282108183111715613f4257613f42613547565b8160405284359150613f538261311d565b908252602084013590613f6582613efe565b8160208401526040850135915080821115613f7f57600080fd5b613f8b36838701613611565b60408401526060850135915080821115613fa457600080fd5b50613fb136828601613611565b60608301525092915050565b815167ffffffffffffffff811115613fd757613fd7613547565b613feb81613fe584546137bc565b84613af1565b602080601f83116001811461403e57600084156140085750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b39565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561408b5788860151825594840194600190910190840161406c565b50858210156140c757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516138728184602087016131d5565b6000602082840312156140fb57600080fd5b813567ffffffffffffffff8082111561411357600080fd5b908301906060828603121561412757600080fd5b61412f61359f565b82358281111561413e57600080fd5b61414a87828601613611565b82525060208301358281111561415f57600080fd5b61416b87828601613611565b602083015250604083013592506002831061418557600080fd5b6040810192909252509392505050565b600080604083850312156141a857600080fd5b505080516020909101519092909150565b67ffffffffffffffff83168152604060208201526000825160a060408401526141e560e08401826131f9565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261422183836131f9565b9250604086015191508085840301608086015261423e83836132d4565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061427c82826131f9565b9695505050505050565b60006020828403121561429857600080fd5b5051919050565b8082018082111561050757610507613c5b565b6000602082840312156142c457600080fd5b81516120fa81613efe565b8181038181111561050757610507613c5b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientWithACKABI = CCIPClientWithACKMetaData.ABI @@ -262,6 +262,28 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetRouter() (common.Ad return _CCIPClientWithACK.Contract.GetRouter(&_CCIPClientWithACK.CallOpts) } +func (_CCIPClientWithACK *CCIPClientWithACKCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _CCIPClientWithACK.contract.Call(opts, &out, "i_isPreFunded") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) IIsPreFunded() (bool, error) { + return _CCIPClientWithACK.Contract.IIsPreFunded(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) IIsPreFunded() (bool, error) { + return _CCIPClientWithACK.Contract.IIsPreFunded(&_CCIPClientWithACK.CallOpts) +} + func (_CCIPClientWithACK *CCIPClientWithACKCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { var out []interface{} err := _CCIPClientWithACK.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) @@ -402,28 +424,6 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SMessageStatus(message return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) } -func (_CCIPClientWithACK *CCIPClientWithACKCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _CCIPClientWithACK.contract.Call(opts, &out, "s_shouldUsePreFunding") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_CCIPClientWithACK *CCIPClientWithACKSession) SShouldUsePreFunding() (bool, error) { - return _CCIPClientWithACK.Contract.SShouldUsePreFunding(&_CCIPClientWithACK.CallOpts) -} - -func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SShouldUsePreFunding() (bool, error) { - return _CCIPClientWithACK.Contract.SShouldUsePreFunding(&_CCIPClientWithACK.CallOpts) -} - func (_CCIPClientWithACK *CCIPClientWithACKTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { return _CCIPClientWithACK.contract.Transact(opts, "abandonFailedMessage", messageId, receiver) } @@ -544,18 +544,6 @@ func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdateFeeToken(tok return _CCIPClientWithACK.Contract.UpdateFeeToken(&_CCIPClientWithACK.TransactOpts, token) } -func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { - return _CCIPClientWithACK.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) -} - -func (_CCIPClientWithACK *CCIPClientWithACKSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _CCIPClientWithACK.Contract.UpdatePreFundingStatus(&_CCIPClientWithACK.TransactOpts, usePreFunding) -} - -func (_CCIPClientWithACK *CCIPClientWithACKTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _CCIPClientWithACK.Contract.UpdatePreFundingStatus(&_CCIPClientWithACK.TransactOpts, usePreFunding) -} - func (_CCIPClientWithACK *CCIPClientWithACKTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _CCIPClientWithACK.contract.Transact(opts, "updateRouter", newRouter) } @@ -2552,123 +2540,6 @@ func (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParseOwnershipTransferred(l return event, nil } -type CCIPClientWithACKPreFundingStateUpdatedIterator struct { - Event *CCIPClientWithACKPreFundingStateUpdated - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *CCIPClientWithACKPreFundingStateUpdatedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(CCIPClientWithACKPreFundingStateUpdated) - 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(CCIPClientWithACKPreFundingStateUpdated) - 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 *CCIPClientWithACKPreFundingStateUpdatedIterator) Error() error { - return it.fail -} - -func (it *CCIPClientWithACKPreFundingStateUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type CCIPClientWithACKPreFundingStateUpdated struct { - UsePreFunding bool - Raw types.Log -} - -func (_CCIPClientWithACK *CCIPClientWithACKFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientWithACKPreFundingStateUpdatedIterator, error) { - - logs, sub, err := _CCIPClientWithACK.contract.FilterLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return &CCIPClientWithACKPreFundingStateUpdatedIterator{contract: _CCIPClientWithACK.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil -} - -func (_CCIPClientWithACK *CCIPClientWithACKFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKPreFundingStateUpdated) (event.Subscription, error) { - - logs, sub, err := _CCIPClientWithACK.contract.WatchLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(CCIPClientWithACKPreFundingStateUpdated) - if err := _CCIPClientWithACK.contract.UnpackLog(event, "PreFundingStateUpdated", 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 (_CCIPClientWithACK *CCIPClientWithACKFilterer) ParsePreFundingStateUpdated(log types.Log) (*CCIPClientWithACKPreFundingStateUpdated, error) { - event := new(CCIPClientWithACKPreFundingStateUpdated) - if err := _CCIPClientWithACK.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type CCIPClientWithACKTokensWithdrawnByOwnerIterator struct { Event *CCIPClientWithACKTokensWithdrawnByOwner @@ -2843,8 +2714,6 @@ func (_CCIPClientWithACK *CCIPClientWithACK) ParseLog(log types.Log) (generated. return _CCIPClientWithACK.ParseOwnershipTransferRequested(log) case _CCIPClientWithACK.abi.Events["OwnershipTransferred"].ID: return _CCIPClientWithACK.ParseOwnershipTransferred(log) - case _CCIPClientWithACK.abi.Events["PreFundingStateUpdated"].ID: - return _CCIPClientWithACK.ParsePreFundingStateUpdated(log) case _CCIPClientWithACK.abi.Events["TokensWithdrawnByOwner"].ID: return _CCIPClientWithACK.ParseTokensWithdrawnByOwner(log) @@ -2913,10 +2782,6 @@ func (CCIPClientWithACKOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } -func (CCIPClientWithACKPreFundingStateUpdated) Topic() common.Hash { - return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") -} - func (CCIPClientWithACKTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -2932,6 +2797,8 @@ type CCIPClientWithACKInterface interface { GetRouter(opts *bind.CallOpts) (common.Address, error) + IIsPreFunded(opts *bind.CallOpts) (bool, error) + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -2946,8 +2813,6 @@ type CCIPClientWithACKInterface interface { SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) - SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) - AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) @@ -2968,8 +2833,6 @@ type CCIPClientWithACKInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) - UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -3066,12 +2929,6 @@ type CCIPClientWithACKInterface interface { ParseOwnershipTransferred(log types.Log) (*CCIPClientWithACKOwnershipTransferred, error) - FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*CCIPClientWithACKPreFundingStateUpdatedIterator, error) - - WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKPreFundingStateUpdated) (event.Subscription, error) - - ParsePreFundingStateUpdated(log types.Log) (*CCIPClientWithACKPreFundingStateUpdated, error) - FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*CCIPClientWithACKTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *CCIPClientWithACKTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, 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 20edfc1dc4..9a22771d44 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620049e5380380620049e58339810160408190526200003491620005e8565b8181600182803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000160565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03928316179055600780549185166001600160a81b03199092168217600160a01b85151502179055159050620001555760025460075462000155916001600160a01b0391821691166000196200020b565b5050505050620006e5565b336001600160a01b03821603620001ba5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002895750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000261573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000287919062000627565b155b620002fd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003559185916200035a16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003a9906001600160a01b0385169084906200042b565b805190915015620003555780806020019051810190620003ca919062000641565b620003555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043c848460008562000444565b949350505050565b606082471015620004a75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004c5919062000692565b60006040518083038185875af1925050503d806000811462000504576040519150601f19603f3d011682016040523d82523d6000602084013e62000509565b606091505b5090925090506200051d8783838762000528565b979650505050505050565b606083156200059c57825160000362000594576001600160a01b0385163b620005945760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b50816200043c565b6200043c8383815115620005b35781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006b0565b6001600160a01b0381168114620005e557600080fd5b50565b60008060408385031215620005fc57600080fd5b82516200060981620005cf565b60208401519092506200061c81620005cf565b809150509250929050565b6000602082840312156200063a57600080fd5b5051919050565b6000602082840312156200065457600080fd5b815180151581146200066557600080fd5b9392505050565b60005b83811015620006895781810151838201526020016200066f565b50506000910152565b60008251620006a68184602087016200066c565b9190910192915050565b6020815260008251806020840152620006d18160408501602087016200066c565b601f01601f19169190910160400192915050565b6142f080620006f56000396000f3fe6080604052600436106101bb5760003560e01c80639fe74e26116100ec578063c89245d51161008a578063e89b448511610064578063e89b44851461058d578063ec4a9a26146105ae578063f2fde38b146105e0578063ff2deec31461060057600080fd5b8063c89245d51461052d578063cf6730f81461054d578063e4ca87541461056d57600080fd5b8063b5a11011116100c6578063b5a1101114610481578063bee518a4146104a1578063c25da3fe146104ed578063c851cc321461050d57600080fd5b80639fe74e2614610406578063b0f479a114610426578063b187bd261461045157600080fd5b80635e35359e1161015957806379ba50971161013357806379ba5097146103865780638462a2b91461039b57806385572ffb146103bb5780638da5cb5b146103db57600080fd5b80635e35359e146103195780636939cd97146103395780636d62d6331461036657600080fd5b8063181f5a7711610195578063181f5a771461023e5780632874d8bf1461028a5780632b6e5d631461029f57806335f170ef146102eb57600080fd5b80630a9094dc146101c75780630e958d6b146101fc57806316c38b3c1461021c57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101e76101e236600461317e565b61062d565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b506101e76102173660046131ad565b610640565b34801561022857600080fd5b5061023c610237366004613240565b61068b565b005b34801561024a57600080fd5b50604080518082018252601681527f50696e67506f6e6744656d6f20312e362e302d64657600000000000000000000602082015290516101f391906132cb565b34801561029657600080fd5b5061023c6106dd565b3480156102ab57600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b3480156102f757600080fd5b5061030b6103063660046132de565b610719565b6040516101f39291906132fb565b34801561032557600080fd5b5061023c61033436600461334b565b610845565b34801561034557600080fd5b5061035961035436600461317e565b61091a565b6040516101f391906133e9565b34801561037257600080fd5b5061023c61038136600461347d565b610b25565b34801561039257600080fd5b5061023c610d3c565b3480156103a757600080fd5b5061023c6103b63660046134f9565b610e39565b3480156103c757600080fd5b5061023c6103d6366004613565565b61117a565b3480156103e757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102c6565b34801561041257600080fd5b5061023c6104213660046135a0565b611383565b34801561043257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102c6565b34801561045d57600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101e7565b34801561048d57600080fd5b5061023c61049c3660046135e2565b611537565b3480156104ad57600080fd5b506007547501000000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101f3565b3480156104f957600080fd5b5061023c610508366004613240565b611740565b34801561051957600080fd5b5061023c610528366004613610565b6117cc565b34801561053957600080fd5b5061023c610548366004613610565b611898565b34801561055957600080fd5b5061023c610568366004613565565b611a02565b34801561057957600080fd5b5061023c61058836600461317e565b611b8d565b6105a061059b366004613762565b611e5b565b6040519081526020016101f3565b3480156105ba57600080fd5b506007546101e79074010000000000000000000000000000000000000000900460ff1681565b3480156105ec57600080fd5b5061023c6105fb366004613610565b612409565b34801561060c57600080fd5b506007546102c69073ffffffffffffffffffffffffffffffffffffffff1681565b600061063a60058361241d565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061066f908590859061386f565b9081526040519081900360200190205460ff1690509392505050565b610693612438565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106e5612438565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905561071760016124b9565b565b6003602052600090815260409020805481906107349061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546107609061387f565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b5050505050908060010180546107c29061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546107ee9061387f565b801561083b5780601f106108105761010080835404028352916020019161083b565b820191906000526020600020905b81548152906001019060200180831161081e57829003601f168201915b5050505050905082565b61084d612438565b73ffffffffffffffffffffffffffffffffffffffff831661088d5761088873ffffffffffffffffffffffffffffffffffffffff8316826125de565b6108ae565b6108ae73ffffffffffffffffffffffffffffffffffffffff84168383612738565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161090d91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916109899061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546109b59061387f565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b50505050508152602001600382018054610a1b9061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a479061387f565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b175760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ac2565b505050915250909392505050565b610b2d612438565b610b3860058361241d565b610b76576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610bf75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610ba2565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c4760028301826130cc565b610c556003830160006130cc565b610c63600483016000613106565b50610c71905060058461280c565b5060005b8151811015610ceb57610ce383838381518110610c9457610c946138d2565b602002602001015160200151848481518110610cb257610cb26138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166127389092919063ffffffff16565b600101610c75565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b6d565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e41612438565b60005b81811015610fd45760036000848484818110610e6257610e626138d2565b9050602002810190610e749190613901565b610e829060208101906132de565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610eb957610eb96138d2565b9050602002810190610ecb9190613901565b610ed990602081019061393f565b604051610ee792919061386f565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f2e57610f2e6138d2565b9050602002810190610f409190613901565b610f4e90602081019061393f565b604051610f5c92919061386f565b6040518091039020838383818110610f7657610f766138d2565b9050602002810190610f889190613901565b610f969060208101906132de565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e44565b5060005b8381101561117357600160036000878785818110610ff857610ff86138d2565b905060200281019061100a9190613901565b6110189060208101906132de565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061104f5761104f6138d2565b90506020028101906110619190613901565b61106f90602081019061393f565b60405161107d92919061386f565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106110cd576110cd6138d2565b90506020028101906110df9190613901565b6110ed90602081019061393f565b6040516110fb92919061386f565b6040518091039020858583818110611115576111156138d2565b90506020028101906111279190613901565b6111359060208101906132de565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610fd8565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146111cd576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b6d565b6111dd60408201602083016132de565b67ffffffffffffffff81166000908152600360205260409020805481906112039061387f565b905060000361124a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b6d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611286908690600401613aa6565b600060405180830381600087803b1580156112a057600080fd5b505af19250505080156112b1575060015b611351573d8080156112df576040519150601f19603f3d011682016040523d82523d6000602084013e6112e4565b606091505b506112f160058535612818565b5083356000908152600460205260409020849061130e8282613e80565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113439084906132cb565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61138b612438565b60005b8181101561137e5760008383838181106113aa576113aa6138d2565b90506020028101906113bc9190613f7a565b6113c590613fae565b9050806020015161143057805167ffffffffffffffff1660009081526003602052604081206113f3916130cc565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261152e565b80604001515160000361146f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061149a908261405f565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906114c8908261405f565b5080604001516040516114db9190614179565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212836060015160405161152591906132cb565b60405180910390a35b5060010161138e565b61153f612438565b73ffffffffffffffffffffffffffffffffffffffff8116158061156a575067ffffffffffffffff8216155b156115a1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261169391614179565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061137e908261405f565b611748612438565b6007805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b906117c190831515815260200190565b60405180910390a150565b6117d4612438565b73ffffffffffffffffffffffffffffffffffffffff8116611821576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6118a0612438565b60075473ffffffffffffffffffffffffffffffffffffffff1615611901576119016118e060025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612824565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156119ae576119ae61196e60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6129a6565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611a3b576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4b60408201602083016132de565b611a58604083018361393f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611aaf9250905061387f565b15905080611b055750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611af09190614179565b9081526040519081900360200190205460ff16155b15611b3e57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b6d91906132cb565b60085474010000000000000000000000000000000000000000900460ff1661137e5761137e611b70606085018561393f565b810190611b7d919061317e565b611b8890600161418b565b6124b9565b611b9860058261241d565b611bd1576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b6d565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611c189061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c449061387f565b8015611c915780601f10611c6657610100808354040283529160200191611c91565b820191906000526020600020905b815481529060010190602001808311611c7457829003601f168201915b50505050508152602001600382018054611caa9061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd69061387f565b8015611d235780601f10611cf857610100808354040283529160200191611d23565b820191906000526020600020905b815481529060010190602001808311611d0657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611da65760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611d51565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611df860028301826130cc565b611e066003830160006130cc565b611e14600483016000613106565b50611e22905060058361280c565b50611e2c81612aaa565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611e849061387f565b9050600003611ecb576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b6d565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611efb9061387f565b80601f0160208091040260200160405190810160405280929190818152602001828054611f279061387f565b8015611f745780601f10611f4957610100808354040283529160200191611f74565b820191906000526020600020905b815481529060010190602001808311611f5757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611fd59061387f565b80601f01602080910402602001604051908101604052809291908181526020018280546120019061387f565b801561204e5780601f106120235761010080835404028352916020019161204e565b820191906000526020600020905b81548152906001019060200180831161203157829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906120b5908b90869060040161419e565b602060405180830381865afa1580156120d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f6919061426b565b60075490915073ffffffffffffffffffffffffffffffffffffffff16158015906121af57506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061426b565b105b156121d9576007546121d99073ffffffffffffffffffffffffffffffffffffffff16333084612b1c565b60005b875181101561232c5761224c33308a84815181106121fc576121fc6138d2565b6020026020010151602001518b858151811061221a5761221a6138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b1c909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061227c5761227c6138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146123245760025488516123249173ffffffffffffffffffffffffffffffffffffffff16908a90849081106122d5576122d56138d2565b6020026020010151602001518a84815181106122f3576122f36138d2565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128249092919063ffffffff16565b6001016121dc565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561235f576000612361565b825b8a856040518463ffffffff1660e01b815260040161238092919061419e565b60206040518083038185885af115801561239e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123c3919061426b565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516123f691815260200190565b60405180910390a1505050509392505050565b612411612438565b61241a81612b7a565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b6d565b806001166001036124fc576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612530565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161254591815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260075460008085526020850190935290935061137e92750100000000000000000000000000000000000000000090910467ffffffffffffffff16916125d7565b60408051808201909152600080825260208201528152602001906001900390816125b05790505b5083611e5b565b80471015612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b6d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146126a2576040519150601f19603f3d011682016040523d82523d6000602084013e6126a7565b606091505b505090508061137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b6d565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261137e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612c6f565b60006124318383612d7b565b60006124318383612e6e565b8015806128c457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c2919061426b565b155b612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b6d565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261137e9084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161278a565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a41919061426b565b612a4b919061418b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612aa49085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161278a565b50505050565b612ab2612438565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612aee9084906004016133e9565b600060405180830381600087803b158015612b0857600080fd5b505af1158015611173573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aa49085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161278a565b3373ffffffffffffffffffffffffffffffffffffffff821603612bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b6d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612cd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ebd9092919063ffffffff16565b80519091501561137e5780806020019051810190612cef9190614284565b61137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b6d565b60008181526001830160205260408120548015612e64576000612d9f6001836142a1565b8554909150600090612db3906001906142a1565b9050818114612e18576000866000018281548110612dd357612dd36138d2565b9060005260206000200154905080876000018481548110612df657612df66138d2565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612e2957612e296142b4565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061063a565b600091505061063a565b6000818152600183016020526040812054612eb55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561063a565b50600061063a565b6060612ecc8484600085612ed4565b949350505050565b606082471015612f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b6d565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f8f9190614179565b60006040518083038185875af1925050503d8060008114612fcc576040519150601f19603f3d011682016040523d82523d6000602084013e612fd1565b606091505b5091509150612fe287838387612fed565b979650505050505050565b6060831561308357825160000361307c5773ffffffffffffffffffffffffffffffffffffffff85163b61307c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b6d565b5081612ecc565b612ecc83838151156130985781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d91906132cb565b5080546130d89061387f565b6000825580601f106130e8575050565b601f01602090049060005260206000209081019061241a9190613127565b508054600082556002029060005260206000209081019061241a9190613140565b5b8082111561313c5760008155600101613128565b5090565b5b8082111561313c5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613141565b60006020828403121561319057600080fd5b5035919050565b67ffffffffffffffff8116811461241a57600080fd5b6000806000604084860312156131c257600080fd5b83356131cd81613197565b9250602084013567ffffffffffffffff808211156131ea57600080fd5b818601915086601f8301126131fe57600080fd5b81358181111561320d57600080fd5b87602082850101111561321f57600080fd5b6020830194508093505050509250925092565b801515811461241a57600080fd5b60006020828403121561325257600080fd5b813561243181613232565b60005b83811015613278578181015183820152602001613260565b50506000910152565b6000815180845261329981602086016020860161325d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124316020830184613281565b6000602082840312156132f057600080fd5b813561243181613197565b60408152600061330e6040830185613281565b82810360208401526133208185613281565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461241a57600080fd5b60008060006060848603121561336057600080fd5b833561336b81613329565b9250602084013561337b81613329565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156133de578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016133a1565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261342360c0840182613281565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261345f8383613281565b925060808601519150808584030160a086015250613320828261338c565b6000806040838503121561349057600080fd5b8235915060208301356134a281613329565b809150509250929050565b60008083601f8401126134bf57600080fd5b50813567ffffffffffffffff8111156134d757600080fd5b6020830191508360208260051b85010111156134f257600080fd5b9250929050565b6000806000806040858703121561350f57600080fd5b843567ffffffffffffffff8082111561352757600080fd5b613533888389016134ad565b9096509450602087013591508082111561354c57600080fd5b50613559878288016134ad565b95989497509550505050565b60006020828403121561357757600080fd5b813567ffffffffffffffff81111561358e57600080fd5b820160a0818503121561243157600080fd5b600080602083850312156135b357600080fd5b823567ffffffffffffffff8111156135ca57600080fd5b6135d6858286016134ad565b90969095509350505050565b600080604083850312156135f557600080fd5b823561360081613197565b915060208301356134a281613329565b60006020828403121561362257600080fd5b813561243181613329565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561367f5761367f61362d565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136cc576136cc61362d565b604052919050565b600082601f8301126136e557600080fd5b813567ffffffffffffffff8111156136ff576136ff61362d565b61373060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613685565b81815284602083860101111561374557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561377757600080fd5b833561378281613197565b925060208481013567ffffffffffffffff808211156137a057600080fd5b818701915087601f8301126137b457600080fd5b8135818111156137c6576137c661362d565b6137d4848260051b01613685565b81815260069190911b8301840190848101908a8311156137f357600080fd5b938501935b8285101561383f576040858c0312156138115760008081fd5b61381961365c565b853561382481613329565b815285870135878201528252604090940193908501906137f8565b96505050604087013592508083111561385757600080fd5b5050613865868287016136d4565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061389357607f821691505b6020821081036138cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261393557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261397457600080fd5b83018035915067ffffffffffffffff82111561398f57600080fd5b6020019150368190038213156134f257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139d957600080fd5b830160208101925035905067ffffffffffffffff8111156139f957600080fd5b8036038213156134f257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133de578135613a7481613329565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613a61565b602081528135602082015260006020830135613ac181613197565b67ffffffffffffffff8082166040850152613adf60408601866139a4565b925060a06060860152613af660c086018483613a08565b925050613b0660608601866139a4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613b3c858385613a08565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613b7557600080fd5b60209288019283019235915083821115613b8e57600080fd5b8160061b3603831315613ba057600080fd5b8685030160a0870152612fe2848284613a51565b601f82111561137e576000816000526020600020601f850160051c81016020861015613bdd5750805b601f850160051c820191505b81811015613bfc57828155600101613be9565b505050505050565b67ffffffffffffffff831115613c1c57613c1c61362d565b613c3083613c2a835461387f565b83613bb4565b6000601f841160018114613c825760008515613c4c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611173565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613cd15786850135825560209485019460019092019101613cb1565b5086821015613d0c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613d5881613329565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613dbe57613dbe61362d565b805483825580841015613e4b5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613dff57613dff613d1e565b8086168614613e1057613e10613d1e565b5060008360005260206000208360011b81018760011b820191505b80821015613e46578282558284830155600282019150613e2b565b505050505b5060008181526020812083915b85811015613bfc57613e6a8383613d4d565b6040929092019160029190910190600101613e58565b81358155600181016020830135613e9681613197565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613ed6604086018661393f565b93509150613ee8838360028701613c04565b613ef5606086018661393f565b93509150613f07838360038701613c04565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613f3e57600080fd5b918401918235915080821115613f5357600080fd5b506020820191508060061b3603821315613f6c57600080fd5b612aa4818360048601613da5565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261393557600080fd5b600060808236031215613fc057600080fd5b6040516080810167ffffffffffffffff8282108183111715613fe457613fe461362d565b8160405284359150613ff582613197565b90825260208401359061400782613232565b816020840152604085013591508082111561402157600080fd5b61402d368387016136d4565b6040840152606085013591508082111561404657600080fd5b50614053368286016136d4565b60608301525092915050565b815167ffffffffffffffff8111156140795761407961362d565b61408d81614087845461387f565b84613bb4565b602080601f8311600181146140e057600084156140aa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613bfc565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561412d5788860151825594840194600190910190840161410e565b508582101561416957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161393581846020870161325d565b8082018082111561063a5761063a613d1e565b67ffffffffffffffff83168152604060208201526000825160a060408401526141ca60e0840182613281565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526142068383613281565b92506040860151915080858403016080860152614223838361338c565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506142618282613281565b9695505050505050565b60006020828403121561427d57600080fd5b5051919050565b60006020828403121561429657600080fd5b815161243181613232565b8181038181111561063a5761063a613d1e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b50604051620048c5380380620048c58339810160408190526200003491620005df565b8181600182803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000157565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492861692909116821790558215156080521590506200014c576002546007546200014c916001600160a01b03918216911660001962000202565b5050505050620006dc565b336001600160a01b03821603620001b15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002805750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000258573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027e91906200061e565b155b620002f45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200034c9185916200035116565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003a0906001600160a01b03851690849062000422565b8051909150156200034c5780806020019051810190620003c1919062000638565b6200034c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043384846000856200043b565b949350505050565b6060824710156200049e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004bc919062000689565b60006040518083038185875af1925050503d8060008114620004fb576040519150601f19603f3d011682016040523d82523d6000602084013e62000500565b606091505b50909250905062000514878383876200051f565b979650505050505050565b60608315620005935782516000036200058b576001600160a01b0385163b6200058b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b508162000433565b620004338383815115620005aa5781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006a7565b6001600160a01b0381168114620005dc57600080fd5b50565b60008060408385031215620005f357600080fd5b82516200060081620005c6565b60208401519092506200061381620005c6565b809150509250929050565b6000602082840312156200063157600080fd5b5051919050565b6000602082840312156200064b57600080fd5b815180151581146200065c57600080fd5b9392505050565b60005b838110156200068057818101518382015260200162000666565b50506000910152565b600082516200069d81846020870162000663565b9190910192915050565b6020815260008251806020840152620006c881604085016020870162000663565b601f01601f19169190910160400192915050565b6080516141c6620006ff60003960008181610320015261204301526141c66000f3fe6080604052600436106101b05760003560e01c806385572ffb116100ec578063c851cc321161008a578063e4ca875411610064578063e4ca875414610575578063e89b448514610595578063f2fde38b146105b6578063ff2deec3146105d657600080fd5b8063c851cc3214610515578063c89245d514610535578063cf6730f81461055557600080fd5b8063b0f479a1116100c6578063b0f479a11461044f578063b187bd261461047a578063b5a11011146104aa578063bee518a4146104ca57600080fd5b806385572ffb146103e45780638da5cb5b146104045780639fe74e261461042f57600080fd5b806335f170ef116101595780636939cd97116101335780636939cd97146103625780636d62d6331461038f57806379ba5097146103af5780638462a2b9146103c457600080fd5b806335f170ef146102e057806353d4f18a1461030e5780635e35359e1461034257600080fd5b8063181f5a771161018a578063181f5a77146102335780632874d8bf1461027f5780632b6e5d631461029457600080fd5b80630a9094dc146101bc5780630e958d6b146101f157806316c38b3c1461021157600080fd5b366101b757005b600080fd5b3480156101c857600080fd5b506101dc6101d7366004613054565b610603565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b506101dc61020c366004613083565b610616565b34801561021d57600080fd5b5061023161022c366004613116565b610661565b005b34801561023f57600080fd5b50604080518082018252601681527f50696e67506f6e6744656d6f20312e362e302d64657600000000000000000000602082015290516101e891906131a1565b34801561028b57600080fd5b506102316106b3565b3480156102a057600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e8565b3480156102ec57600080fd5b506103006102fb3660046131b4565b6106ef565b6040516101e89291906131d1565b34801561031a57600080fd5b506101dc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561034e57600080fd5b5061023161035d366004613221565b61081b565b34801561036e57600080fd5b5061038261037d366004613054565b6108f0565b6040516101e891906132bf565b34801561039b57600080fd5b506102316103aa366004613353565b610afb565b3480156103bb57600080fd5b50610231610d12565b3480156103d057600080fd5b506102316103df3660046133cf565b610e0f565b3480156103f057600080fd5b506102316103ff36600461343b565b611150565b34801561041057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561043b57600080fd5b5061023161044a366004613476565b611359565b34801561045b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561048657600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101dc565b3480156104b657600080fd5b506102316104c53660046134b8565b61150d565b3480156104d657600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101e8565b34801561052157600080fd5b506102316105303660046134e6565b611715565b34801561054157600080fd5b506102316105503660046134e6565b6117e1565b34801561056157600080fd5b5061023161057036600461343b565b61194b565b34801561058157600080fd5b50610231610590366004613054565b611ad6565b6105a86105a3366004613638565b611da4565b6040519081526020016101e8565b3480156105c257600080fd5b506102316105d13660046134e6565b6122e0565b3480156105e257600080fd5b506007546102bb9073ffffffffffffffffffffffffffffffffffffffff1681565b60006106106005836122f4565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106459085908590613745565b9081526040519081900360200190205460ff1690509392505050565b61066961230f565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106bb61230f565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556106ed6001612390565b565b60036020526000908152604090208054819061070a90613755565b80601f016020809104026020016040519081016040528092919081815260200182805461073690613755565b80156107835780601f1061075857610100808354040283529160200191610783565b820191906000526020600020905b81548152906001019060200180831161076657829003601f168201915b50505050509080600101805461079890613755565b80601f01602080910402602001604051908101604052809291908181526020018280546107c490613755565b80156108115780601f106107e657610100808354040283529160200191610811565b820191906000526020600020905b8154815290600101906020018083116107f457829003601f168201915b5050505050905082565b61082361230f565b73ffffffffffffffffffffffffffffffffffffffff83166108635761085e73ffffffffffffffffffffffffffffffffffffffff8316826124b4565b610884565b61088473ffffffffffffffffffffffffffffffffffffffff8416838361260e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516108e391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161095f90613755565b80601f016020809104026020016040519081016040528092919081815260200182805461098b90613755565b80156109d85780601f106109ad576101008083540402835291602001916109d8565b820191906000526020600020905b8154815290600101906020018083116109bb57829003601f168201915b505050505081526020016003820180546109f190613755565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90613755565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610aed5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a98565b505050915250909392505050565b610b0361230f565b610b0e6005836122f4565b610b4c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610bcd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b78565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c1d6002830182612fa2565b610c2b600383016000612fa2565b610c39600483016000612fdc565b50610c4790506005846126e2565b5060005b8151811015610cc157610cb983838381518110610c6a57610c6a6137a8565b602002602001015160200151848481518110610c8857610c886137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661260e9092919063ffffffff16565b600101610c4b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b43565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e1761230f565b60005b81811015610faa5760036000848484818110610e3857610e386137a8565b9050602002810190610e4a91906137d7565b610e589060208101906131b4565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e8f57610e8f6137a8565b9050602002810190610ea191906137d7565b610eaf906020810190613815565b604051610ebd929190613745565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f0457610f046137a8565b9050602002810190610f1691906137d7565b610f24906020810190613815565b604051610f32929190613745565b6040518091039020838383818110610f4c57610f4c6137a8565b9050602002810190610f5e91906137d7565b610f6c9060208101906131b4565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e1a565b5060005b8381101561114957600160036000878785818110610fce57610fce6137a8565b9050602002810190610fe091906137d7565b610fee9060208101906131b4565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110611025576110256137a8565b905060200281019061103791906137d7565b611045906020810190613815565b604051611053929190613745565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106110a3576110a36137a8565b90506020028101906110b591906137d7565b6110c3906020810190613815565b6040516110d1929190613745565b60405180910390208585838181106110eb576110eb6137a8565b90506020028101906110fd91906137d7565b61110b9060208101906131b4565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610fae565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146111a3576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b43565b6111b360408201602083016131b4565b67ffffffffffffffff81166000908152600360205260409020805481906111d990613755565b9050600003611220576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b43565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061125c90869060040161397c565b600060405180830381600087803b15801561127657600080fd5b505af1925050508015611287575060015b611327573d8080156112b5576040519150601f19603f3d011682016040523d82523d6000602084013e6112ba565b606091505b506112c7600585356126ee565b508335600090815260046020526040902084906112e48282613d56565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113199084906131a1565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61136161230f565b60005b81811015611354576000838383818110611380576113806137a8565b90506020028101906113929190613e50565b61139b90613e84565b9050806020015161140657805167ffffffffffffffff1660009081526003602052604081206113c991612fa2565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611504565b806040015151600003611445576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906114709082613f35565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061149e9082613f35565b5080604001516040516114b1919061404f565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516114fb91906131a1565b60405180910390a35b50600101611364565b61151561230f565b73ffffffffffffffffffffffffffffffffffffffff81161580611540575067ffffffffffffffff8216155b15611577576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526116689161404f565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113549082613f35565b61171d61230f565b73ffffffffffffffffffffffffffffffffffffffff811661176a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6117e961230f565b60075473ffffffffffffffffffffffffffffffffffffffff161561184a5761184a61182960025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006126fa565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156118f7576118f76118b760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61287c565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611984576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199460408201602083016131b4565b6119a16040830183613815565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506119f892509050613755565b15905080611a4e5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611a39919061404f565b9081526040519081900360200190205460ff16155b15611a8757806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b4391906131a1565b60085474010000000000000000000000000000000000000000900460ff1661135457611354611ab96060850185613815565b810190611ac69190613054565b611ad1906001614061565b612390565b611ae16005826122f4565b611b1a576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b43565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b6190613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8d90613755565b8015611bda5780601f10611baf57610100808354040283529160200191611bda565b820191906000526020600020905b815481529060010190602001808311611bbd57829003601f168201915b50505050508152602001600382018054611bf390613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1f90613755565b8015611c6c5780601f10611c4157610100808354040283529160200191611c6c565b820191906000526020600020905b815481529060010190602001808311611c4f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611cef5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c9a565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611d416002830182612fa2565b611d4f600383016000612fa2565b611d5d600483016000612fdc565b50611d6b90506005836126e2565b50611d7581612980565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611dcd90613755565b9050600003611e14576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b43565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611e4490613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090613755565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611f1e90613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90613755565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611ffe908b908690600401614074565b602060405180830381865afa15801561201b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203f9190614141565b90507f0000000000000000000000000000000000000000000000000000000000000000158015612086575060075473ffffffffffffffffffffffffffffffffffffffff1615155b156120b0576007546120b09073ffffffffffffffffffffffffffffffffffffffff163330846129f2565b60005b87518110156122035761212333308a84815181106120d3576120d36137a8565b6020026020010151602001518b85815181106120f1576120f16137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129f2909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110612153576121536137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121fb5760025488516121fb9173ffffffffffffffffffffffffffffffffffffffff16908a90849081106121ac576121ac6137a8565b6020026020010151602001518a84815181106121ca576121ca6137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126fa9092919063ffffffff16565b6001016120b3565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612236576000612238565b825b8a856040518463ffffffff1660e01b8152600401612257929190614074565b60206040518083038185885af1158015612275573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061229a9190614141565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516122cd91815260200190565b60405180910390a1505050509392505050565b6122e861230f565b6122f181612a50565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b43565b806001166001036123d3576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612407565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161241c91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600754600080855260208501909352909350611354927401000000000000000000000000000000000000000090910467ffffffffffffffff16916124ad565b60408051808201909152600080825260208201528152602001906001900390816124865790505b5083611da4565b8047101561251e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b43565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612578576040519150601f19603f3d011682016040523d82523d6000602084013e61257d565b606091505b5050905080611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b43565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113549084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b45565b60006123088383612c51565b60006123088383612d44565b80158061279a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127989190614141565b155b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b43565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113549084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612660565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156128f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129179190614141565b6129219190614061565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061297a9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612660565b50505050565b61298861230f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906129c49084906004016132bf565b600060405180830381600087803b1580156129de57600080fd5b505af1158015611149573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261297a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612660565b3373ffffffffffffffffffffffffffffffffffffffff821603612acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b43565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612ba7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d939092919063ffffffff16565b8051909150156113545780806020019051810190612bc5919061415a565b611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b43565b60008181526001830160205260408120548015612d3a576000612c75600183614177565b8554909150600090612c8990600190614177565b9050818114612cee576000866000018281548110612ca957612ca96137a8565b9060005260206000200154905080876000018481548110612ccc57612ccc6137a8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cff57612cff61418a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610610565b6000915050610610565b6000818152600183016020526040812054612d8b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610610565b506000610610565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b43565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e65919061404f565b60006040518083038185875af1925050503d8060008114612ea2576040519150601f19603f3d011682016040523d82523d6000602084013e612ea7565b606091505b5091509150612eb887838387612ec3565b979650505050505050565b60608315612f59578251600003612f525773ffffffffffffffffffffffffffffffffffffffff85163b612f52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b43565b5081612da2565b612da28383815115612f6e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4391906131a1565b508054612fae90613755565b6000825580601f10612fbe575050565b601f0160209004906000526020600020908101906122f19190612ffd565b50805460008255600202906000526020600020908101906122f19190613016565b5b808211156130125760008155600101612ffe565b5090565b5b808211156130125780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613017565b60006020828403121561306657600080fd5b5035919050565b67ffffffffffffffff811681146122f157600080fd5b60008060006040848603121561309857600080fd5b83356130a38161306d565b9250602084013567ffffffffffffffff808211156130c057600080fd5b818601915086601f8301126130d457600080fd5b8135818111156130e357600080fd5b8760208285010111156130f557600080fd5b6020830194508093505050509250925092565b80151581146122f157600080fd5b60006020828403121561312857600080fd5b813561230881613108565b60005b8381101561314e578181015183820152602001613136565b50506000910152565b6000815180845261316f816020860160208601613133565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006123086020830184613157565b6000602082840312156131c657600080fd5b81356123088161306d565b6040815260006131e46040830185613157565b82810360208401526131f68185613157565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122f157600080fd5b60008060006060848603121561323657600080fd5b8335613241816131ff565b92506020840135613251816131ff565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156132b4578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613277565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526132f960c0840182613157565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133358383613157565b925060808601519150808584030160a0860152506131f68282613262565b6000806040838503121561336657600080fd5b823591506020830135613378816131ff565b809150509250929050565b60008083601f84011261339557600080fd5b50813567ffffffffffffffff8111156133ad57600080fd5b6020830191508360208260051b85010111156133c857600080fd5b9250929050565b600080600080604085870312156133e557600080fd5b843567ffffffffffffffff808211156133fd57600080fd5b61340988838901613383565b9096509450602087013591508082111561342257600080fd5b5061342f87828801613383565b95989497509550505050565b60006020828403121561344d57600080fd5b813567ffffffffffffffff81111561346457600080fd5b820160a0818503121561230857600080fd5b6000806020838503121561348957600080fd5b823567ffffffffffffffff8111156134a057600080fd5b6134ac85828601613383565b90969095509350505050565b600080604083850312156134cb57600080fd5b82356134d68161306d565b91506020830135613378816131ff565b6000602082840312156134f857600080fd5b8135612308816131ff565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561355557613555613503565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135a2576135a2613503565b604052919050565b600082601f8301126135bb57600080fd5b813567ffffffffffffffff8111156135d5576135d5613503565b61360660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161355b565b81815284602083860101111561361b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561364d57600080fd5b83356136588161306d565b925060208481013567ffffffffffffffff8082111561367657600080fd5b818701915087601f83011261368a57600080fd5b81358181111561369c5761369c613503565b6136aa848260051b0161355b565b81815260069190911b8301840190848101908a8311156136c957600080fd5b938501935b82851015613715576040858c0312156136e75760008081fd5b6136ef613532565b85356136fa816131ff565b815285870135878201528252604090940193908501906136ce565b96505050604087013592508083111561372d57600080fd5b505061373b868287016135aa565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061376957607f821691505b6020821081036137a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261380b57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261384a57600080fd5b83018035915067ffffffffffffffff82111561386557600080fd5b6020019150368190038213156133c857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138af57600080fd5b830160208101925035905067ffffffffffffffff8111156138cf57600080fd5b8036038213156133c857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156132b457813561394a816131ff565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613937565b6020815281356020820152600060208301356139978161306d565b67ffffffffffffffff80821660408501526139b5604086018661387a565b925060a060608601526139cc60c0860184836138de565b9250506139dc606086018661387a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a128583856138de565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613a4b57600080fd5b60209288019283019235915083821115613a6457600080fd5b8160061b3603831315613a7657600080fd5b8685030160a0870152612eb8848284613927565b601f821115611354576000816000526020600020601f850160051c81016020861015613ab35750805b601f850160051c820191505b81811015613ad257828155600101613abf565b505050505050565b67ffffffffffffffff831115613af257613af2613503565b613b0683613b008354613755565b83613a8a565b6000601f841160018114613b585760008515613b225750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611149565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613ba75786850135825560209485019460019092019101613b87565b5086821015613be2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c2e816131ff565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c9457613c94613503565b805483825580841015613d215760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613cd557613cd5613bf4565b8086168614613ce657613ce6613bf4565b5060008360005260206000208360011b81018760011b820191505b80821015613d1c578282558284830155600282019150613d01565b505050505b5060008181526020812083915b85811015613ad257613d408383613c23565b6040929092019160029190910190600101613d2e565b81358155600181016020830135613d6c8161306d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613dac6040860186613815565b93509150613dbe838360028701613ada565b613dcb6060860186613815565b93509150613ddd838360038701613ada565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e1457600080fd5b918401918235915080821115613e2957600080fd5b506020820191508060061b3603821315613e4257600080fd5b61297a818360048601613c7b565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261380b57600080fd5b600060808236031215613e9657600080fd5b6040516080810167ffffffffffffffff8282108183111715613eba57613eba613503565b8160405284359150613ecb8261306d565b908252602084013590613edd82613108565b8160208401526040850135915080821115613ef757600080fd5b613f03368387016135aa565b60408401526060850135915080821115613f1c57600080fd5b50613f29368286016135aa565b60608301525092915050565b815167ffffffffffffffff811115613f4f57613f4f613503565b613f6381613f5d8454613755565b84613a8a565b602080601f831160018114613fb65760008415613f805750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ad2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561400357888601518255948401946001909101908401613fe4565b508582101561403f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161380b818460208701613133565b8082018082111561061057610610613bf4565b67ffffffffffffffff83168152604060208201526000825160a060408401526140a060e0840182613157565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526140dc8383613157565b925060408601519150808584030160808601526140f98383613262565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506141378282613157565b9695505050505050565b60006020828403121561415357600080fd5b5051919050565b60006020828403121561416c57600080fd5b815161230881613108565b8181038181111561061057610610613bf4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -284,6 +284,28 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetRouter() (common.Address, err return _PingPongDemo.Contract.GetRouter(&_PingPongDemo.CallOpts) } +func (_PingPongDemo *PingPongDemoCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "i_isPreFunded") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) IIsPreFunded() (bool, error) { + return _PingPongDemo.Contract.IIsPreFunded(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) IIsPreFunded() (bool, error) { + return _PingPongDemo.Contract.IIsPreFunded(&_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) @@ -424,28 +446,6 @@ func (_PingPongDemo *PingPongDemoCallerSession) SFeeToken() (common.Address, err return _PingPongDemo.Contract.SFeeToken(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "s_shouldUsePreFunding") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_PingPongDemo *PingPongDemoSession) SShouldUsePreFunding() (bool, error) { - return _PingPongDemo.Contract.SShouldUsePreFunding(&_PingPongDemo.CallOpts) -} - -func (_PingPongDemo *PingPongDemoCallerSession) SShouldUsePreFunding() (bool, error) { - return _PingPongDemo.Contract.SShouldUsePreFunding(&_PingPongDemo.CallOpts) -} - func (_PingPongDemo *PingPongDemoCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "typeAndVersion") @@ -624,18 +624,6 @@ func (_PingPongDemo *PingPongDemoTransactorSession) UpdateFeeToken(token common. return _PingPongDemo.Contract.UpdateFeeToken(&_PingPongDemo.TransactOpts, token) } -func (_PingPongDemo *PingPongDemoTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) -} - -func (_PingPongDemo *PingPongDemoSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _PingPongDemo.Contract.UpdatePreFundingStatus(&_PingPongDemo.TransactOpts, usePreFunding) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _PingPongDemo.Contract.UpdatePreFundingStatus(&_PingPongDemo.TransactOpts, usePreFunding) -} - func (_PingPongDemo *PingPongDemoTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "updateRouter", newRouter) } @@ -2595,123 +2583,6 @@ func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDe return event, nil } -type PingPongDemoPreFundingStateUpdatedIterator struct { - Event *PingPongDemoPreFundingStateUpdated - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *PingPongDemoPreFundingStateUpdatedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(PingPongDemoPreFundingStateUpdated) - 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(PingPongDemoPreFundingStateUpdated) - 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 *PingPongDemoPreFundingStateUpdatedIterator) Error() error { - return it.fail -} - -func (it *PingPongDemoPreFundingStateUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type PingPongDemoPreFundingStateUpdated struct { - UsePreFunding bool - Raw types.Log -} - -func (_PingPongDemo *PingPongDemoFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*PingPongDemoPreFundingStateUpdatedIterator, error) { - - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return &PingPongDemoPreFundingStateUpdatedIterator{contract: _PingPongDemo.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil -} - -func (_PingPongDemo *PingPongDemoFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoPreFundingStateUpdated) (event.Subscription, error) { - - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(PingPongDemoPreFundingStateUpdated) - if err := _PingPongDemo.contract.UnpackLog(event, "PreFundingStateUpdated", 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) ParsePreFundingStateUpdated(log types.Log) (*PingPongDemoPreFundingStateUpdated, error) { - event := new(PingPongDemoPreFundingStateUpdated) - if err := _PingPongDemo.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type PingPongDemoTokensWithdrawnByOwnerIterator struct { Event *PingPongDemoTokensWithdrawnByOwner @@ -2886,8 +2757,6 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, return _PingPongDemo.ParsePing(log) case _PingPongDemo.abi.Events["Pong"].ID: return _PingPongDemo.ParsePong(log) - case _PingPongDemo.abi.Events["PreFundingStateUpdated"].ID: - return _PingPongDemo.ParsePreFundingStateUpdated(log) case _PingPongDemo.abi.Events["TokensWithdrawnByOwner"].ID: return _PingPongDemo.ParseTokensWithdrawnByOwner(log) @@ -2956,10 +2825,6 @@ func (PingPongDemoPong) Topic() common.Hash { return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") } -func (PingPongDemoPreFundingStateUpdated) Topic() common.Hash { - return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") -} - func (PingPongDemoTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -2977,6 +2842,8 @@ type PingPongDemoInterface interface { GetRouter(opts *bind.CallOpts) (common.Address, error) + IIsPreFunded(opts *bind.CallOpts) (bool, error) + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -2991,8 +2858,6 @@ type PingPongDemoInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) - SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -3021,8 +2886,6 @@ type PingPongDemoInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) - UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -3119,12 +2982,6 @@ type PingPongDemoInterface interface { ParsePong(log types.Log) (*PingPongDemoPong, error) - FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*PingPongDemoPreFundingStateUpdatedIterator, error) - - WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoPreFundingStateUpdated) (event.Subscription, error) - - ParsePreFundingStateUpdated(log types.Log) (*PingPongDemoPreFundingStateUpdated, error) - FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*PingPongDemoTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *PingPongDemoTokensWithdrawnByOwner, token []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 9519116ed9..2bf9c9835c 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"PreFundingStateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[],\"name\":\"s_shouldUsePreFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"name\":\"updatePreFundingStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b5060405162004ef638038062004ef6833981016040819052620000349162000616565b82828181600182803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200018e565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03928316179055600780549185166001600160a81b03199092168217600160a01b85151502179055159050620001575760025460075462000157916001600160a01b03918216911660001962000239565b50505050508060026200016b91906200066f565b600860156101000a81548160ff021916908360ff1602179055505050506200075f565b336001600160a01b03821603620001e85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002b75750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200028f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b59190620006a1565b155b6200032b5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003839185916200038816565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003d7906001600160a01b03851690849062000459565b805190915015620003835780806020019051810190620003f89190620006bb565b620003835760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b60606200046a848460008562000472565b949350505050565b606082471015620004d55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004f391906200070c565b60006040518083038185875af1925050503d806000811462000532576040519150601f19603f3d011682016040523d82523d6000602084013e62000537565b606091505b5090925090506200054b8783838762000556565b979650505050505050565b60608315620005ca578251600003620005c2576001600160a01b0385163b620005c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b50816200046a565b6200046a8383815115620005e15781518083602001fd5b8060405162461bcd60e51b81526004016200008a91906200072a565b6001600160a01b03811681146200061357600080fd5b50565b6000806000606084860312156200062c57600080fd5b83516200063981620005fd565b60208501519093506200064c81620005fd565b604085015190925060ff811681146200066457600080fd5b809150509250925092565b60ff81811683821602908116908181146200069a57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215620006b457600080fd5b5051919050565b600060208284031215620006ce57600080fd5b81518015158114620006df57600080fd5b9392505050565b60005b8381101562000703578181015183820152602001620006e9565b50506000910152565b6000825162000720818460208701620006e6565b9190910192915050565b60208152600082518060208401526200074b816040850160208701620006e6565b601f01601f19169190910160400192915050565b614787806200076f6000396000f3fe6080604052600436106101dc5760003560e01c80639fe74e2611610102578063cf6730f811610095578063ec4a9a2611610064578063ec4a9a2614610637578063ef686d8e14610669578063f2fde38b14610689578063ff2deec3146106a957600080fd5b8063cf6730f814610598578063e4ca8754146105b8578063e6c725f5146105d8578063e89b44851461061657600080fd5b8063bee518a4116100d1578063bee518a4146104ec578063c25da3fe14610538578063c851cc3214610558578063c89245d51461057857600080fd5b80639fe74e2614610451578063b0f479a114610471578063b187bd261461049c578063b5a11011146104cc57600080fd5b80635e35359e1161017a5780638462a2b9116101495780638462a2b9146103c657806385572ffb146103e65780638da5cb5b146104065780638f491cba1461043157600080fd5b80635e35359e146103445780636939cd97146103645780636d62d6331461039157806379ba5097146103b157600080fd5b8063181f5a77116101b6578063181f5a771461025f5780632874d8bf146102b55780632b6e5d63146102ca57806335f170ef1461031657600080fd5b80630a9094dc146101e85780630e958d6b1461021d57806316c38b3c1461023d57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b5061020861020336600461359a565b6106d6565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b506102086102383660046135c9565b6106e9565b34801561024957600080fd5b5061025d61025836600461365c565b610734565b005b34801561026b57600080fd5b506102a86040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b60405161021491906136e7565b3480156102c157600080fd5b5061025d610786565b3480156102d657600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b34801561032257600080fd5b506103366103313660046136fa565b6107c2565b604051610214929190613717565b34801561035057600080fd5b5061025d61035f366004613767565b6108ee565b34801561037057600080fd5b5061038461037f36600461359a565b6109c3565b6040516102149190613805565b34801561039d57600080fd5b5061025d6103ac366004613899565b610bce565b3480156103bd57600080fd5b5061025d610de5565b3480156103d257600080fd5b5061025d6103e1366004613915565b610ee2565b3480156103f257600080fd5b5061025d610401366004613981565b611223565b34801561041257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102f1565b34801561043d57600080fd5b5061025d61044c36600461359a565b61142c565b34801561045d57600080fd5b5061025d61046c3660046139bc565b611608565b34801561047d57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102f1565b3480156104a857600080fd5b5060085474010000000000000000000000000000000000000000900460ff16610208565b3480156104d857600080fd5b5061025d6104e73660046139fe565b6117bc565b3480156104f857600080fd5b506007547501000000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610214565b34801561054457600080fd5b5061025d61055336600461365c565b6119c5565b34801561056457600080fd5b5061025d610573366004613a2c565b611a51565b34801561058457600080fd5b5061025d610593366004613a2c565b611b1d565b3480156105a457600080fd5b5061025d6105b3366004613981565b611c87565b3480156105c457600080fd5b5061025d6105d336600461359a565b611e12565b3480156105e457600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610214565b610629610624366004613b7e565b6120e0565b604051908152602001610214565b34801561064357600080fd5b506007546102089074010000000000000000000000000000000000000000900460ff1681565b34801561067557600080fd5b5061025d610684366004613c8b565b61268e565b34801561069557600080fd5b5061025d6106a4366004613a2c565b612711565b3480156106b557600080fd5b506007546102f19073ffffffffffffffffffffffffffffffffffffffff1681565b60006106e3600583612722565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107189085908590613cae565b9081526040519081900360200190205460ff1690509392505050565b61073c61273d565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61078e61273d565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107c060016127be565b565b6003602052600090815260409020805481906107dd90613cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461080990613cbe565b80156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b50505050509080600101805461086b90613cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461089790613cbe565b80156108e45780601f106108b9576101008083540402835291602001916108e4565b820191906000526020600020905b8154815290600101906020018083116108c757829003601f168201915b5050505050905082565b6108f661273d565b73ffffffffffffffffffffffffffffffffffffffff83166109365761093173ffffffffffffffffffffffffffffffffffffffff8316826129fa565b610957565b61095773ffffffffffffffffffffffffffffffffffffffff84168383612b54565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109b691815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a3290613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e90613cbe565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b50505050508152602001600382018054610ac490613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613cbe565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bc05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b6b565b505050915250909392505050565b610bd661273d565b610be1600583612722565b610c1f576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610ca05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c4b565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610cf060028301826134e8565b610cfe6003830160006134e8565b610d0c600483016000613522565b50610d1a9050600584612c28565b5060005b8151811015610d9457610d8c83838381518110610d3d57610d3d613d11565b602002602001015160200151848481518110610d5b57610d5b613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b549092919063ffffffff16565b600101610d1e565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c16565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610eea61273d565b60005b8181101561107d5760036000848484818110610f0b57610f0b613d11565b9050602002810190610f1d9190613d40565b610f2b9060208101906136fa565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f6257610f62613d11565b9050602002810190610f749190613d40565b610f82906020810190613d7e565b604051610f90929190613cae565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610fd757610fd7613d11565b9050602002810190610fe99190613d40565b610ff7906020810190613d7e565b604051611005929190613cae565b604051809103902083838381811061101f5761101f613d11565b90506020028101906110319190613d40565b61103f9060208101906136fa565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610eed565b5060005b8381101561121c576001600360008787858181106110a1576110a1613d11565b90506020028101906110b39190613d40565b6110c19060208101906136fa565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110f8576110f8613d11565b905060200281019061110a9190613d40565b611118906020810190613d7e565b604051611126929190613cae565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061117657611176613d11565b90506020028101906111889190613d40565b611196906020810190613d7e565b6040516111a4929190613cae565b60405180910390208585838181106111be576111be613d11565b90506020028101906111d09190613d40565b6111de9060208101906136fa565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611081565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611276576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610c16565b61128660408201602083016136fa565b67ffffffffffffffff81166000908152600360205260409020805481906112ac90613cbe565b90506000036112f3576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c16565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061132f908690600401613ee5565b600060405180830381600087803b15801561134957600080fd5b505af192505050801561135a575060015b6113fa573d808015611388576040519150601f19603f3d011682016040523d82523d6000602084013e61138d565b606091505b5061139a60058535612c34565b508335600090815260046020526040902084906113b782826142bf565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113ec9084906136e7565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6008547501000000000000000000000000000000000000000000900460ff16158061147457506008547501000000000000000000000000000000000000000000900460ff1681105b1561147c5750565b6008546001906114a8907501000000000000000000000000000000000000000000900460ff16836143b9565b116116055760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b000000000000000000000000000000000000000000000000000000008152750100000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906143f4565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115c357600080fd5b505af11580156115d7573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b61161061273d565b60005b8181101561142757600083838381811061162f5761162f613d11565b90506020028101906116419190614411565b61164a90614445565b905080602001516116b557805167ffffffffffffffff166000908152600360205260408120611678916134e8565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26117b3565b8060400151516000036116f4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061171f90826144f6565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061174d90826144f6565b5080604001516040516117609190614610565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516117aa91906136e7565b60405180910390a35b50600101611613565b6117c461273d565b73ffffffffffffffffffffffffffffffffffffffff811615806117ef575067ffffffffffffffff8216155b15611826576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261191891614610565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061142790826144f6565b6119cd61273d565b6007805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b90611a4690831515815260200190565b60405180910390a150565b611a5961273d565b73ffffffffffffffffffffffffffffffffffffffff8116611aa6576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611b2561273d565b60075473ffffffffffffffffffffffffffffffffffffffff1615611b8657611b86611b6560025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612c40565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611c3357611c33611bf360025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612dc2565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611cc0576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd060408201602083016136fa565b611cdd6040830183613d7e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611d3492509050613cbe565b15905080611d8a5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611d759190614610565b9081526040519081900360200190205460ff16155b15611dc357806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610c1691906136e7565b60085474010000000000000000000000000000000000000000900460ff1661142757611427611df56060850185613d7e565b810190611e02919061359a565b611e0d906001614622565b6127be565b611e1d600582612722565b611e56576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610c16565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e9d90613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec990613cbe565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b50505050508152602001600382018054611f2f90613cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5b90613cbe565b8015611fa85780601f10611f7d57610100808354040283529160200191611fa8565b820191906000526020600020905b815481529060010190602001808311611f8b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561202b5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611fd6565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905591925061207d60028301826134e8565b61208b6003830160006134e8565b612099600483016000613522565b506120a79050600583612c28565b506120b181612ec6565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061210990613cbe565b9050600003612150576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c16565b6040805160a08101825267ffffffffffffffff881660009081526003602052918220805482919061218090613cbe565b80601f01602080910402602001604051908101604052809291908181526020018280546121ac90613cbe565b80156121f95780601f106121ce576101008083540402835291602001916121f9565b820191906000526020600020905b8154815290600101906020018083116121dc57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b16600090815260039092529020600101805460809092019161225a90613cbe565b80601f016020809104026020016040519081016040528092919081815260200182805461228690613cbe565b80156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded9061233a908b908690600401614635565b602060405180830381865afa158015612357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237b9190614702565b60075490915073ffffffffffffffffffffffffffffffffffffffff161580159061243457506007546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561240e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124329190614702565b105b1561245e5760075461245e9073ffffffffffffffffffffffffffffffffffffffff16333084612f38565b60005b87518110156125b1576124d133308a848151811061248157612481613d11565b6020026020010151602001518b858151811061249f5761249f613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612f38909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff9091169089908390811061250157612501613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146125a95760025488516125a99173ffffffffffffffffffffffffffffffffffffffff16908a908490811061255a5761255a613d11565b6020026020010151602001518a848151811061257857612578613d11565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612c409092919063ffffffff16565b600101612461565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156125e45760006125e6565b825b8a856040518463ffffffff1660e01b8152600401612605929190614635565b60206040518083038185885af1158015612623573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126489190614702565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161267b91815260200190565b60405180910390a1505050509392505050565b61269661273d565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf390602001611a46565b61271961273d565b61160581612f96565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c16565b80600116600103612801576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612835565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b61283e8161142c565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161289691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561291057816020015b60408051808201909152600080825260208201528152602001906001900390816128e95790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061296760025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760159054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b81526004016129b7929190614635565b6020604051808303816000875af11580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190614702565b80471015612a64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c16565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612abe576040519150601f19603f3d011682016040523d82523d6000602084013e612ac3565b606091505b5050905080611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c16565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526114279084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261308b565b60006127368383613197565b6000612736838361328a565b801580612ce057506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cde9190614702565b155b612d6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610c16565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526114279084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612ba6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5d9190614702565b612e679190614622565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612ec09085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612ba6565b50505050565b612ece61273d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612f0a908490600401613805565b600060405180830381600087803b158015612f2457600080fd5b505af115801561121c573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612ec09085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ba6565b3373ffffffffffffffffffffffffffffffffffffffff821603613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c16565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006130ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132d99092919063ffffffff16565b805190915015611427578080602001905181019061310b919061471b565b611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610c16565b600081815260018301602052604081205480156132805760006131bb600183614738565b85549091506000906131cf90600190614738565b90508181146132345760008660000182815481106131ef576131ef613d11565b906000526020600020015490508087600001848154811061321257613212613d11565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806132455761324561474b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106e3565b60009150506106e3565b60008181526001830160205260408120546132d1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106e3565b5060006106e3565b60606132e884846000856132f0565b949350505050565b606082471015613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610c16565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516133ab9190614610565b60006040518083038185875af1925050503d80600081146133e8576040519150601f19603f3d011682016040523d82523d6000602084013e6133ed565b606091505b50915091506133fe87838387613409565b979650505050505050565b6060831561349f5782516000036134985773ffffffffffffffffffffffffffffffffffffffff85163b613498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c16565b50816132e8565b6132e883838151156134b45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1691906136e7565b5080546134f490613cbe565b6000825580601f10613504575050565b601f0160209004906000526020600020908101906116059190613543565b5080546000825560020290600052602060002090810190611605919061355c565b5b808211156135585760008155600101613544565b5090565b5b808211156135585780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556000600182015560020161355d565b6000602082840312156135ac57600080fd5b5035919050565b67ffffffffffffffff8116811461160557600080fd5b6000806000604084860312156135de57600080fd5b83356135e9816135b3565b9250602084013567ffffffffffffffff8082111561360657600080fd5b818601915086601f83011261361a57600080fd5b81358181111561362957600080fd5b87602082850101111561363b57600080fd5b6020830194508093505050509250925092565b801515811461160557600080fd5b60006020828403121561366e57600080fd5b81356127368161364e565b60005b8381101561369457818101518382015260200161367c565b50506000910152565b600081518084526136b5816020860160208601613679565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612736602083018461369d565b60006020828403121561370c57600080fd5b8135612736816135b3565b60408152600061372a604083018561369d565b828103602084015261373c818561369d565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461160557600080fd5b60008060006060848603121561377c57600080fd5b833561378781613745565b9250602084013561379781613745565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156137fa578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016137bd565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261383f60c084018261369d565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261387b838361369d565b925060808601519150808584030160a08601525061373c82826137a8565b600080604083850312156138ac57600080fd5b8235915060208301356138be81613745565b809150509250929050565b60008083601f8401126138db57600080fd5b50813567ffffffffffffffff8111156138f357600080fd5b6020830191508360208260051b850101111561390e57600080fd5b9250929050565b6000806000806040858703121561392b57600080fd5b843567ffffffffffffffff8082111561394357600080fd5b61394f888389016138c9565b9096509450602087013591508082111561396857600080fd5b50613975878288016138c9565b95989497509550505050565b60006020828403121561399357600080fd5b813567ffffffffffffffff8111156139aa57600080fd5b820160a0818503121561273657600080fd5b600080602083850312156139cf57600080fd5b823567ffffffffffffffff8111156139e657600080fd5b6139f2858286016138c9565b90969095509350505050565b60008060408385031215613a1157600080fd5b8235613a1c816135b3565b915060208301356138be81613745565b600060208284031215613a3e57600080fd5b813561273681613745565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a9b57613a9b613a49565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613ae857613ae8613a49565b604052919050565b600082601f830112613b0157600080fd5b813567ffffffffffffffff811115613b1b57613b1b613a49565b613b4c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613aa1565b818152846020838601011115613b6157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b9357600080fd5b8335613b9e816135b3565b925060208481013567ffffffffffffffff80821115613bbc57600080fd5b818701915087601f830112613bd057600080fd5b813581811115613be257613be2613a49565b613bf0848260051b01613aa1565b81815260069190911b8301840190848101908a831115613c0f57600080fd5b938501935b82851015613c5b576040858c031215613c2d5760008081fd5b613c35613a78565b8535613c4081613745565b81528587013587820152825260409094019390850190613c14565b965050506040870135925080831115613c7357600080fd5b5050613c8186828701613af0565b9150509250925092565b600060208284031215613c9d57600080fd5b813560ff8116811461273657600080fd5b8183823760009101908152919050565b600181811c90821680613cd257607f821691505b602082108103613d0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613d7457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613db357600080fd5b83018035915067ffffffffffffffff821115613dce57600080fd5b60200191503681900382131561390e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e1857600080fd5b830160208101925035905067ffffffffffffffff811115613e3857600080fd5b80360382131561390e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156137fa578135613eb381613745565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613ea0565b602081528135602082015260006020830135613f00816135b3565b67ffffffffffffffff8082166040850152613f1e6040860186613de3565b925060a06060860152613f3560c086018483613e47565b925050613f456060860186613de3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f7b858385613e47565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613fb457600080fd5b60209288019283019235915083821115613fcd57600080fd5b8160061b3603831315613fdf57600080fd5b8685030160a08701526133fe848284613e90565b601f821115611427576000816000526020600020601f850160051c8101602086101561401c5750805b601f850160051c820191505b8181101561403b57828155600101614028565b505050505050565b67ffffffffffffffff83111561405b5761405b613a49565b61406f836140698354613cbe565b83613ff3565b6000601f8411600181146140c1576000851561408b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561121c565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561411057868501358255602094850194600190920191016140f0565b508682101561414b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561419781613745565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156141fd576141fd613a49565b80548382558084101561428a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461423e5761423e61415d565b808616861461424f5761424f61415d565b5060008360005260206000208360011b81018760011b820191505b8082101561428557828255828483015560028201915061426a565b505050505b5060008181526020812083915b8581101561403b576142a9838361418c565b6040929092019160029190910190600101614297565b813581556001810160208301356142d5816135b3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556143156040860186613d7e565b93509150614327838360028701614043565b6143346060860186613d7e565b93509150614346838360038701614043565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261437d57600080fd5b91840191823591508082111561439257600080fd5b506020820191508060061b36038213156143ab57600080fd5b612ec08183600486016141e4565b6000826143ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561440657600080fd5b815161273681613745565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d7457600080fd5b60006080823603121561445757600080fd5b6040516080810167ffffffffffffffff828210818311171561447b5761447b613a49565b816040528435915061448c826135b3565b90825260208401359061449e8261364e565b81602084015260408501359150808211156144b857600080fd5b6144c436838701613af0565b604084015260608501359150808211156144dd57600080fd5b506144ea36828601613af0565b60608301525092915050565b815167ffffffffffffffff81111561451057614510613a49565b6145248161451e8454613cbe565b84613ff3565b602080601f83116001811461457757600084156145415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561403b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156145c4578886015182559484019460019091019084016145a5565b508582101561460057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613d74818460208701613679565b808201808211156106e3576106e361415d565b67ffffffffffffffff83168152604060208201526000825160a0604084015261466160e084018261369d565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261469d838361369d565b925060408601519150808584030160808601526146ba83836137a8565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506146f8828261369d565b9695505050505050565b60006020828403121561471457600080fd5b5051919050565b60006020828403121561472d57600080fd5b81516127368161364e565b818103818111156106e3576106e361415d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b5060405162004ddc38038062004ddc83398101604081905262000034916200060d565b82828181600182803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000185565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492861692909116821790558215156080521590506200014e576002546007546200014e916001600160a01b03918216911660001962000230565b505050505080600262000162919062000666565b600860156101000a81548160ff021916908360ff16021790555050505062000756565b336001600160a01b03821603620001df5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002ae5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000286573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ac919062000698565b155b620003225760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200037a9185916200037f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ce906001600160a01b03851690849062000450565b8051909150156200037a5780806020019051810190620003ef9190620006b2565b6200037a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b606062000461848460008562000469565b949350505050565b606082471015620004cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004ea919062000703565b60006040518083038185875af1925050503d806000811462000529576040519150601f19603f3d011682016040523d82523d6000602084013e6200052e565b606091505b50909250905062000542878383876200054d565b979650505050505050565b60608315620005c1578251600003620005b9576001600160a01b0385163b620005b95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b508162000461565b620004618383815115620005d85781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000721565b6001600160a01b03811681146200060a57600080fd5b50565b6000806000606084860312156200062357600080fd5b83516200063081620005f4565b60208501519093506200064381620005f4565b604085015190925060ff811681146200065b57600080fd5b809150509250925092565b60ff81811683821602908116908181146200069157634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215620006ab57600080fd5b5051919050565b600060208284031215620006c557600080fd5b81518015158114620006d657600080fd5b9392505050565b60005b83811015620006fa578181015183820152602001620006e0565b50506000910152565b6000825162000717818460208701620006dd565b9190910192915050565b602081526000825180602084015262000742816040850160208701620006dd565b601f01601f19169190910160400192915050565b608051614663620007796000396000818161034b01526122c701526146636000f3fe6080604052600436106101d15760003560e01c80638f491cba116100f7578063c89245d511610095578063e89b448511610064578063e89b44851461061e578063ef686d8e1461063f578063f2fde38b1461065f578063ff2deec31461067f57600080fd5b8063c89245d514610580578063cf6730f8146105a0578063e4ca8754146105c0578063e6c725f5146105e057600080fd5b8063b187bd26116100d1578063b187bd26146104c5578063b5a11011146104f5578063bee518a414610515578063c851cc321461056057600080fd5b80638f491cba1461045a5780639fe74e261461047a578063b0f479a11461049a57600080fd5b806353d4f18a1161016f57806379ba50971161013e57806379ba5097146103da5780638462a2b9146103ef57806385572ffb1461040f5780638da5cb5b1461042f57600080fd5b806353d4f18a146103395780635e35359e1461036d5780636939cd971461038d5780636d62d633146103ba57600080fd5b8063181f5a77116101ab578063181f5a77146102545780632874d8bf146102aa5780632b6e5d63146102bf57806335f170ef1461030b57600080fd5b80630a9094dc146101dd5780630e958d6b1461021257806316c38b3c1461023257600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004613476565b6106ac565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506101fd61022d3660046134a5565b6106bf565b34801561023e57600080fd5b5061025261024d366004613538565b61070a565b005b34801561026057600080fd5b5061029d6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b60405161020991906135c3565b3480156102b657600080fd5b5061025261075c565b3480156102cb57600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b34801561031757600080fd5b5061032b6103263660046135d6565b610798565b6040516102099291906135f3565b34801561034557600080fd5b506101fd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561037957600080fd5b50610252610388366004613643565b6108c4565b34801561039957600080fd5b506103ad6103a8366004613476565b610999565b60405161020991906136e1565b3480156103c657600080fd5b506102526103d5366004613775565b610ba4565b3480156103e657600080fd5b50610252610dbb565b3480156103fb57600080fd5b5061025261040a3660046137f1565b610eb8565b34801561041b57600080fd5b5061025261042a36600461385d565b6111f9565b34801561043b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102e6565b34801561046657600080fd5b50610252610475366004613476565b611402565b34801561048657600080fd5b50610252610495366004613898565b6115dd565b3480156104a657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102e6565b3480156104d157600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101fd565b34801561050157600080fd5b506102526105103660046138da565b611791565b34801561052157600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610209565b34801561056c57600080fd5b5061025261057b366004613908565b611999565b34801561058c57600080fd5b5061025261059b366004613908565b611a65565b3480156105ac57600080fd5b506102526105bb36600461385d565b611bcf565b3480156105cc57600080fd5b506102526105db366004613476565b611d5a565b3480156105ec57600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610209565b61063161062c366004613a5a565b612028565b604051908152602001610209565b34801561064b57600080fd5b5061025261065a366004613b67565b612564565b34801561066b57600080fd5b5061025261067a366004613908565b6125ed565b34801561068b57600080fd5b506007546102e69073ffffffffffffffffffffffffffffffffffffffff1681565b60006106b96005836125fe565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106ee9085908590613b8a565b9081526040519081900360200190205460ff1690509392505050565b610712612619565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610764612619565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055610796600161269a565b565b6003602052600090815260409020805481906107b390613b9a565b80601f01602080910402602001604051908101604052809291908181526020018280546107df90613b9a565b801561082c5780601f106108015761010080835404028352916020019161082c565b820191906000526020600020905b81548152906001019060200180831161080f57829003601f168201915b50505050509080600101805461084190613b9a565b80601f016020809104026020016040519081016040528092919081815260200182805461086d90613b9a565b80156108ba5780601f1061088f576101008083540402835291602001916108ba565b820191906000526020600020905b81548152906001019060200180831161089d57829003601f168201915b5050505050905082565b6108cc612619565b73ffffffffffffffffffffffffffffffffffffffff831661090c5761090773ffffffffffffffffffffffffffffffffffffffff8316826128d6565b61092d565b61092d73ffffffffffffffffffffffffffffffffffffffff84168383612a30565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161098c91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a0890613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3490613b9a565b8015610a815780601f10610a5657610100808354040283529160200191610a81565b820191906000526020600020905b815481529060010190602001808311610a6457829003601f168201915b50505050508152602001600382018054610a9a90613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac690613b9a565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b965760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b41565b505050915250909392505050565b610bac612619565b610bb76005836125fe565b610bf5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610c765760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c21565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610cc660028301826133c4565b610cd46003830160006133c4565b610ce26004830160006133fe565b50610cf09050600584612b04565b5060005b8151811015610d6a57610d6283838381518110610d1357610d13613bed565b602002602001015160200151848481518110610d3157610d31613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a309092919063ffffffff16565b600101610cf4565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bec565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ec0612619565b60005b818110156110535760036000848484818110610ee157610ee1613bed565b9050602002810190610ef39190613c1c565b610f019060208101906135d6565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f3857610f38613bed565b9050602002810190610f4a9190613c1c565b610f58906020810190613c5a565b604051610f66929190613b8a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610fad57610fad613bed565b9050602002810190610fbf9190613c1c565b610fcd906020810190613c5a565b604051610fdb929190613b8a565b6040518091039020838383818110610ff557610ff5613bed565b90506020028101906110079190613c1c565b6110159060208101906135d6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ec3565b5060005b838110156111f25760016003600087878581811061107757611077613bed565b90506020028101906110899190613c1c565b6110979060208101906135d6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110ce576110ce613bed565b90506020028101906110e09190613c1c565b6110ee906020810190613c5a565b6040516110fc929190613b8a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061114c5761114c613bed565b905060200281019061115e9190613c1c565b61116c906020810190613c5a565b60405161117a929190613b8a565b604051809103902085858381811061119457611194613bed565b90506020028101906111a69190613c1c565b6111b49060208101906135d6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611057565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461124c576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bec565b61125c60408201602083016135d6565b67ffffffffffffffff811660009081526003602052604090208054819061128290613b9a565b90506000036112c9576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bec565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611305908690600401613dc1565b600060405180830381600087803b15801561131f57600080fd5b505af1925050508015611330575060015b6113d0573d80801561135e576040519150601f19603f3d011682016040523d82523d6000602084013e611363565b606091505b5061137060058535612b10565b5083356000908152600460205260409020849061138d828261419b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113c29084906135c3565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6008547501000000000000000000000000000000000000000000900460ff16158061144a57506008547501000000000000000000000000000000000000000000900460ff1681105b156114525750565b60085460019061147e907501000000000000000000000000000000000000000000900460ff1683614295565b116115da5760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561152d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155191906142d0565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6115e5612619565b60005b818110156113fd57600083838381811061160457611604613bed565b905060200281019061161691906142ed565b61161f90614321565b9050806020015161168a57805167ffffffffffffffff16600090815260036020526040812061164d916133c4565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611788565b8060400151516000036116c9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906116f490826143d2565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061172290826143d2565b50806040015160405161173591906144ec565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212836060015160405161177f91906135c3565b60405180910390a35b506001016115e8565b611799612619565b73ffffffffffffffffffffffffffffffffffffffff811615806117c4575067ffffffffffffffff8216155b156117fb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526118ec916144ec565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113fd90826143d2565b6119a1612619565b73ffffffffffffffffffffffffffffffffffffffff81166119ee576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611a6d612619565b60075473ffffffffffffffffffffffffffffffffffffffff1615611ace57611ace611aad60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612b1c565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611b7b57611b7b611b3b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c9e565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611c08576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c1860408201602083016135d6565b611c256040830183613c5a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611c7c92509050613b9a565b15905080611cd25750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611cbd91906144ec565b9081526040519081900360200190205460ff16155b15611d0b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bec91906135c3565b60085474010000000000000000000000000000000000000000900460ff166113fd576113fd611d3d6060850185613c5a565b810190611d4a9190613476565b611d559060016144fe565b61269a565b611d656005826125fe565b611d9e576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610bec565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611de590613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1190613b9a565b8015611e5e5780601f10611e3357610100808354040283529160200191611e5e565b820191906000526020600020905b815481529060010190602001808311611e4157829003601f168201915b50505050508152602001600382018054611e7790613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea390613b9a565b8015611ef05780601f10611ec557610100808354040283529160200191611ef0565b820191906000526020600020905b815481529060010190602001808311611ed357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611f735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f1e565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611fc560028301826133c4565b611fd36003830160006133c4565b611fe16004830160006133fe565b50611fef9050600583612b04565b50611ff981612da2565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061205190613b9a565b9050600003612098576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bec565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906120c890613b9a565b80601f01602080910402602001604051908101604052809291908181526020018280546120f490613b9a565b80156121415780601f1061211657610100808354040283529160200191612141565b820191906000526020600020905b81548152906001019060200180831161212457829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916121a290613b9a565b80601f01602080910402602001604051908101604052809291908181526020018280546121ce90613b9a565b801561221b5780601f106121f05761010080835404028352916020019161221b565b820191906000526020600020905b8154815290600101906020018083116121fe57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90612282908b908690600401614511565b602060405180830381865afa15801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c391906145de565b90507f000000000000000000000000000000000000000000000000000000000000000015801561230a575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15612334576007546123349073ffffffffffffffffffffffffffffffffffffffff16333084612e14565b60005b8751811015612487576123a733308a848151811061235757612357613bed565b6020026020010151602001518b858151811061237557612375613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e14909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106123d7576123d7613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461247f57600254885161247f9173ffffffffffffffffffffffffffffffffffffffff16908a908490811061243057612430613bed565b6020026020010151602001518a848151811061244e5761244e613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b1c9092919063ffffffff16565b600101612337565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156124ba5760006124bc565b825b8a856040518463ffffffff1660e01b81526004016124db929190614511565b60206040518083038185885af11580156124f9573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251e91906145de565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161255191815260200190565b60405180910390a1505050509392505050565b61256c612619565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b6125f5612619565b6115da81612e72565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bec565b806001166001036126dd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612711565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b61271a81611402565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161277291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156127ec57816020015b60408051808201909152600080825260208201528152602001906001900390816127c55790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061284360025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612893929190614511565b6020604051808303816000875af11580156128b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fd91906145de565b80471015612940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bec565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461299a576040519150601f19603f3d011682016040523d82523d6000602084013e61299f565b606091505b50509050806113fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bec565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113fd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f67565b60006126128383613073565b60006126128383613166565b801580612bbc57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bba91906145de565b155b612c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bec565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113fd9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a82565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3991906145de565b612d4391906144fe565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612d9c9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a82565b50505050565b612daa612619565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612de69084906004016136e1565b600060405180830381600087803b158015612e0057600080fd5b505af11580156111f2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612d9c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a82565b3373ffffffffffffffffffffffffffffffffffffffff821603612ef1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bec565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612fc9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131b59092919063ffffffff16565b8051909150156113fd5780806020019051810190612fe791906145f7565b6113fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bec565b6000818152600183016020526040812054801561315c576000613097600183614614565b85549091506000906130ab90600190614614565b90508181146131105760008660000182815481106130cb576130cb613bed565b90600052602060002001549050808760000184815481106130ee576130ee613bed565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061312157613121614627565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106b9565b60009150506106b9565b60008181526001830160205260408120546131ad575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106b9565b5060006106b9565b60606131c484846000856131cc565b949350505050565b60608247101561325e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bec565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161328791906144ec565b60006040518083038185875af1925050503d80600081146132c4576040519150601f19603f3d011682016040523d82523d6000602084013e6132c9565b606091505b50915091506132da878383876132e5565b979650505050505050565b6060831561337b5782516000036133745773ffffffffffffffffffffffffffffffffffffffff85163b613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bec565b50816131c4565b6131c483838151156133905781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec91906135c3565b5080546133d090613b9a565b6000825580601f106133e0575050565b601f0160209004906000526020600020908101906115da919061341f565b50805460008255600202906000526020600020908101906115da9190613438565b5b808211156134345760008155600101613420565b5090565b5b808211156134345780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613439565b60006020828403121561348857600080fd5b5035919050565b67ffffffffffffffff811681146115da57600080fd5b6000806000604084860312156134ba57600080fd5b83356134c58161348f565b9250602084013567ffffffffffffffff808211156134e257600080fd5b818601915086601f8301126134f657600080fd5b81358181111561350557600080fd5b87602082850101111561351757600080fd5b6020830194508093505050509250925092565b80151581146115da57600080fd5b60006020828403121561354a57600080fd5b81356126128161352a565b60005b83811015613570578181015183820152602001613558565b50506000910152565b60008151808452613591816020860160208601613555565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126126020830184613579565b6000602082840312156135e857600080fd5b81356126128161348f565b6040815260006136066040830185613579565b82810360208401526136188185613579565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146115da57600080fd5b60008060006060848603121561365857600080fd5b833561366381613621565b9250602084013561367381613621565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136d6578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613699565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261371b60c0840182613579565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137578383613579565b925060808601519150808584030160a0860152506136188282613684565b6000806040838503121561378857600080fd5b82359150602083013561379a81613621565b809150509250929050565b60008083601f8401126137b757600080fd5b50813567ffffffffffffffff8111156137cf57600080fd5b6020830191508360208260051b85010111156137ea57600080fd5b9250929050565b6000806000806040858703121561380757600080fd5b843567ffffffffffffffff8082111561381f57600080fd5b61382b888389016137a5565b9096509450602087013591508082111561384457600080fd5b50613851878288016137a5565b95989497509550505050565b60006020828403121561386f57600080fd5b813567ffffffffffffffff81111561388657600080fd5b820160a0818503121561261257600080fd5b600080602083850312156138ab57600080fd5b823567ffffffffffffffff8111156138c257600080fd5b6138ce858286016137a5565b90969095509350505050565b600080604083850312156138ed57600080fd5b82356138f88161348f565b9150602083013561379a81613621565b60006020828403121561391a57600080fd5b813561261281613621565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561397757613977613925565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139c4576139c4613925565b604052919050565b600082601f8301126139dd57600080fd5b813567ffffffffffffffff8111156139f7576139f7613925565b613a2860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161397d565b818152846020838601011115613a3d57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a6f57600080fd5b8335613a7a8161348f565b925060208481013567ffffffffffffffff80821115613a9857600080fd5b818701915087601f830112613aac57600080fd5b813581811115613abe57613abe613925565b613acc848260051b0161397d565b81815260069190911b8301840190848101908a831115613aeb57600080fd5b938501935b82851015613b37576040858c031215613b095760008081fd5b613b11613954565b8535613b1c81613621565b81528587013587820152825260409094019390850190613af0565b965050506040870135925080831115613b4f57600080fd5b5050613b5d868287016139cc565b9150509250925092565b600060208284031215613b7957600080fd5b813560ff8116811461261257600080fd5b8183823760009101908152919050565b600181811c90821680613bae57607f821691505b602082108103613be7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c5057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c8f57600080fd5b83018035915067ffffffffffffffff821115613caa57600080fd5b6020019150368190038213156137ea57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cf457600080fd5b830160208101925035905067ffffffffffffffff811115613d1457600080fd5b8036038213156137ea57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136d6578135613d8f81613621565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d7c565b602081528135602082015260006020830135613ddc8161348f565b67ffffffffffffffff8082166040850152613dfa6040860186613cbf565b925060a06060860152613e1160c086018483613d23565b925050613e216060860186613cbf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e57858385613d23565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e9057600080fd5b60209288019283019235915083821115613ea957600080fd5b8160061b3603831315613ebb57600080fd5b8685030160a08701526132da848284613d6c565b601f8211156113fd576000816000526020600020601f850160051c81016020861015613ef85750805b601f850160051c820191505b81811015613f1757828155600101613f04565b505050505050565b67ffffffffffffffff831115613f3757613f37613925565b613f4b83613f458354613b9a565b83613ecf565b6000601f841160018114613f9d5760008515613f675750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556111f2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fec5786850135825560209485019460019092019101613fcc565b5086821015614027577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561407381613621565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140d9576140d9613925565b8054838255808410156141665760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461411a5761411a614039565b808616861461412b5761412b614039565b5060008360005260206000208360011b81018760011b820191505b80821015614161578282558284830155600282019150614146565b505050505b5060008181526020812083915b85811015613f17576141858383614068565b6040929092019160029190910190600101614173565b813581556001810160208301356141b18161348f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141f16040860186613c5a565b93509150614203838360028701613f1f565b6142106060860186613c5a565b93509150614222838360038701613f1f565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261425957600080fd5b91840191823591508082111561426e57600080fd5b506020820191508060061b360382131561428757600080fd5b612d9c8183600486016140c0565b6000826142cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142e257600080fd5b815161261281613621565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c5057600080fd5b60006080823603121561433357600080fd5b6040516080810167ffffffffffffffff828210818311171561435757614357613925565b81604052843591506143688261348f565b90825260208401359061437a8261352a565b816020840152604085013591508082111561439457600080fd5b6143a0368387016139cc565b604084015260608501359150808211156143b957600080fd5b506143c6368286016139cc565b60608301525092915050565b815167ffffffffffffffff8111156143ec576143ec613925565b614400816143fa8454613b9a565b84613ecf565b602080601f831160018114614453576000841561441d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f17565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144a057888601518255948401946001909101908401614481565b50858210156144dc57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613c50818460208701613555565b808201808211156106b9576106b9614039565b67ffffffffffffffff83168152604060208201526000825160a0604084015261453d60e0840182613579565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145798383613579565b925060408601519150808584030160808601526145968383613684565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145d48282613579565b9695505050505050565b6000602082840312156145f057600080fd5b5051919050565b60006020828403121561460957600080fd5b81516126128161352a565b818103818111156106b9576106b9614039565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -306,6 +306,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetRouter() (common. return _SelfFundedPingPong.Contract.GetRouter(&_SelfFundedPingPong.CallOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "i_isPreFunded") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) IIsPreFunded() (bool, error) { + return _SelfFundedPingPong.Contract.IIsPreFunded(&_SelfFundedPingPong.CallOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) IIsPreFunded() (bool, error) { + return _SelfFundedPingPong.Contract.IIsPreFunded(&_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) @@ -446,28 +468,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SFeeToken() (common. return _SelfFundedPingPong.Contract.SFeeToken(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "s_shouldUsePreFunding") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) SShouldUsePreFunding() (bool, error) { - return _SelfFundedPingPong.Contract.SShouldUsePreFunding(&_SelfFundedPingPong.CallOpts) -} - -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SShouldUsePreFunding() (bool, error) { - return _SelfFundedPingPong.Contract.SShouldUsePreFunding(&_SelfFundedPingPong.CallOpts) -} - func (_SelfFundedPingPong *SelfFundedPingPongCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "typeAndVersion") @@ -670,18 +670,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdateFeeToken(t return _SelfFundedPingPong.Contract.UpdateFeeToken(&_SelfFundedPingPong.TransactOpts, token) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "updatePreFundingStatus", usePreFunding) -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.UpdatePreFundingStatus(&_SelfFundedPingPong.TransactOpts, usePreFunding) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) UpdatePreFundingStatus(usePreFunding bool) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.UpdatePreFundingStatus(&_SelfFundedPingPong.TransactOpts, usePreFunding) -} - func (_SelfFundedPingPong *SelfFundedPingPongTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "updateRouter", newRouter) } @@ -2874,123 +2862,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) return event, nil } -type SelfFundedPingPongPreFundingStateUpdatedIterator struct { - Event *SelfFundedPingPongPreFundingStateUpdated - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *SelfFundedPingPongPreFundingStateUpdatedIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(SelfFundedPingPongPreFundingStateUpdated) - 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(SelfFundedPingPongPreFundingStateUpdated) - 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 *SelfFundedPingPongPreFundingStateUpdatedIterator) Error() error { - return it.fail -} - -func (it *SelfFundedPingPongPreFundingStateUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type SelfFundedPingPongPreFundingStateUpdated struct { - UsePreFunding bool - Raw types.Log -} - -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*SelfFundedPingPongPreFundingStateUpdatedIterator, error) { - - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return &SelfFundedPingPongPreFundingStateUpdatedIterator{contract: _SelfFundedPingPong.contract, event: "PreFundingStateUpdated", logs: logs, sub: sub}, nil -} - -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPreFundingStateUpdated) (event.Subscription, error) { - - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "PreFundingStateUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(SelfFundedPingPongPreFundingStateUpdated) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "PreFundingStateUpdated", 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) ParsePreFundingStateUpdated(log types.Log) (*SelfFundedPingPongPreFundingStateUpdated, error) { - event := new(SelfFundedPingPongPreFundingStateUpdated) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "PreFundingStateUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type SelfFundedPingPongTokensWithdrawnByOwnerIterator struct { Event *SelfFundedPingPongTokensWithdrawnByOwner @@ -3169,8 +3040,6 @@ func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generate return _SelfFundedPingPong.ParsePing(log) case _SelfFundedPingPong.abi.Events["Pong"].ID: return _SelfFundedPingPong.ParsePong(log) - case _SelfFundedPingPong.abi.Events["PreFundingStateUpdated"].ID: - return _SelfFundedPingPong.ParsePreFundingStateUpdated(log) case _SelfFundedPingPong.abi.Events["TokensWithdrawnByOwner"].ID: return _SelfFundedPingPong.ParseTokensWithdrawnByOwner(log) @@ -3247,10 +3116,6 @@ func (SelfFundedPingPongPong) Topic() common.Hash { return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") } -func (SelfFundedPingPongPreFundingStateUpdated) Topic() common.Hash { - return common.HexToHash("0x4d54de233ba89f204d426874c47f1dc6afc1c2debc1a9eb0fc6ff9d149530d2b") -} - func (SelfFundedPingPongTokensWithdrawnByOwner) Topic() common.Hash { return common.HexToHash("0x6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e") } @@ -3270,6 +3135,8 @@ type SelfFundedPingPongInterface interface { GetRouter(opts *bind.CallOpts) (common.Address, error) + IIsPreFunded(opts *bind.CallOpts) (bool, error) + IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -3284,8 +3151,6 @@ type SelfFundedPingPongInterface interface { SFeeToken(opts *bind.CallOpts) (common.Address, error) - SShouldUsePreFunding(opts *bind.CallOpts) (bool, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -3318,8 +3183,6 @@ type SelfFundedPingPongInterface interface { UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) - UpdatePreFundingStatus(opts *bind.TransactOpts, usePreFunding bool) (*types.Transaction, error) - UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) @@ -3428,12 +3291,6 @@ type SelfFundedPingPongInterface interface { ParsePong(log types.Log) (*SelfFundedPingPongPong, error) - FilterPreFundingStateUpdated(opts *bind.FilterOpts) (*SelfFundedPingPongPreFundingStateUpdatedIterator, error) - - WatchPreFundingStateUpdated(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPreFundingStateUpdated) (event.Subscription, error) - - ParsePreFundingStateUpdated(log types.Log) (*SelfFundedPingPongPreFundingStateUpdated, error) - FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*SelfFundedPingPongTokensWithdrawnByOwnerIterator, error) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index a296a4bc2d..a5b47a4846 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,8 +5,8 @@ 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 fcb85edfc871504a5146db2e3951193c2de089fe491dd7a2fbc755fd92725cac burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 17bcd03828f43f50028bc4d66fdfb0cf576aaf28895d8f86c6ff598159a0cd64 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6f40135e1488097eafa843839a719fe9a3c21354565b64eb377a24a0a55782ef -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin feb91496fce66944d6271b92fb6ff796adb64faea5fcb225e167651fa2839408 -ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin abff1355e8f0974e995371bfe9f34a47b0882f5efe7a39db0aca56bcdb688778 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin dea752d9f9ecb72854411e2f399082494dba2c26aece40ea05b99b11475dfd27 +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 2e093409dbafb72f601d469e345c765fc348c03814f5dce9573ef6cf26644f01 ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 96612451718090a67090a12388702b808f13a99e615c8c0c51d45f3626f19b3e ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 0e233fa128510939f1b8325f6bbeb6b4fd79edd1d9c663a86b12771f25738c3d ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin cf9f78a1cb3873bb76b6c9873c7cc12cd2d5f3a75e4dabc44fd6d53de4254747 @@ -29,12 +29,12 @@ 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 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 0833089a9c5ab645275dd7c4c73008cd56b8ccfecfe03a574818f0da709aa8a8 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 077b9a1c121c78395b4d2b92a5a278ea84705c3fa13d37fca6aa02f3848f0b44 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 7b2a47349d3fdb8d8b4e206d68577219deca7fabd1e893686fa8f118ad980d2d report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin b326c2bdfce5f51d66cce542ee2be56cb25c7b63e7fa07d483cd3c04844fcc41 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 6960e1fee45ddc3f165ff8ea27d187d42b0d1891f97f5f31354e63167c2503f9 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin a54136ed9bffc74fff830c5066dbfcee6db1f31d636795317267d6baf1e0427a From 57e7d54caf45c0f4f80c3364c4871360b075e77b Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 19 Jul 2024 12:13:06 -0400 Subject: [PATCH 55/61] more feedback fixes --- contracts/gas-snapshots/ccip.gas-snapshot | 65 ++++++++++--------- .../ccip/applications/external/CCIPBase.sol | 24 ++++--- .../ccip/applications/external/CCIPClient.sol | 25 +++++-- .../external/CCIPClientWithACK.sol | 11 +++- .../applications/external/CCIPReceiver.sol | 4 +- .../external/CCIPReceiverWithACK.sol | 11 +++- .../ccip/applications/external/CCIPSender.sol | 1 - .../external/CCIPClientTest.t.sol | 2 +- .../external/CCIPClientWithACKTest.t.sol | 38 +++++++++++ .../external/CCIPReceiverTest.t.sol | 26 ++++++++ .../external/CCIPReceiverWithAckTest.t.sol | 52 ++++++++++++++- 11 files changed, 205 insertions(+), 54 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 6ba99c2a3e..747762e601 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,16 +34,17 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243552) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) -CCIPClientTest:test_HappyPath_Success() (gas: 192126) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325505) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218611) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376510) -CCIPClientTest:test_modifyFeeToken_Success() (gas: 74452) -CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328213) -CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415390) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 344990) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 241276) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 551936) +CCIPClientTest:test_HappyPath_Success() (gas: 192136) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325519) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218625) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376524) +CCIPClientTest:test_modifyFeeToken_Success() (gas: 74403) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328271) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415364) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 345065) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242836) +CCIPClientWithACKTest:test_ccipSend_with_NativeFeeToken_andNoDestTokens_Success() (gas: 399341) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 551947) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -99,22 +100,26 @@ CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1215861) CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1214264) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562) -CCIPReceiverTest:test_HappyPath_Success() (gas: 193794) -CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 408968) -CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 414468) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193787) +CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 408960) +CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 414462) +CCIPReceiverTest:test_abandonFailedMessage_which_has_not_already_failed_Revert() (gas: 13388) +CCIPReceiverTest:test_apply_InvalidChainUpdate_Revert() (gas: 13841) CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 200263) -CCIPReceiverTest:test_modifyRouter_Success() (gas: 26449) -CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 405385) -CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423644) -CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20854) -CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 53245) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 328115) -CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415315) -CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2834492) -CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74845) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339022) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224267) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367566) +CCIPReceiverTest:test_modifyRouter_Success() (gas: 26455) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 405377) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423637) +CCIPReceiverTest:test_retryFailedMessage_which_has_not_already_failed_Revert() (gas: 11168) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20876) +CCIPReceiverWithAckTest:test_attemptACK_message_which_has_already_been_acknowledged_Revert() (gas: 406869) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 53229) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 328101) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415299) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2831876) +CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74818) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339014) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224259) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367558) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -724,10 +729,10 @@ 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: 380130) -PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 177564) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 177502) PingPong_example_plumbing:test_Pausing_Success() (gas: 17877) PingPong_example_plumbing:test_typeAndVersion() (gas: 9741) -PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 201966) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 201958) PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 79823) PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12580) PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 67418) @@ -875,9 +880,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: 268720) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444136) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20273) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 268756) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444236) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20161) 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/external/CCIPBase.sol b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol index 3f1b709d2c..a07e8b4cc1 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPBase.sol @@ -40,16 +40,19 @@ abstract contract CCIPBase is OwnerIsCreator { } struct ChainUpdate { - uint64 chainSelector; // The unique identifier for a chain to send/receive messages - bool allowed; // Whether the chain should be enabled - bytes recipient; // Address on the remote chain which should receive incoming messages from this. The should only be one per-chain - bytes extraArgsBytes; // Additional arguments to pass with the message including manually specifying gas limit and and whether to allow out-of-order execution + uint64 chainSelector; // ─╮ The unique CCIP specific identifier for a chain to send/receive messages + bool allowed; // ───────╯ Whether the chain should be enabled + bytes recipient; // Address on the remote chain which should receive incoming messages from this. The + // should only be one per-chain + bytes extraArgsBytes; // Additional arguments to pass with the message including manually specifying gas limit + // and and whether to allow out-of-order execution } struct ChainConfig { bytes recipient; // The address to send messages to on the destination chain, ABI encoded in the case of a remote EVM chain. bytes extraArgsBytes; // Specifies extraArgs to pass into ccipSend, includes configs such as gas limit, and out-of-order execution. - mapping(bytes recipient => bool isApproved) approvedSender; // Mapping is nested to support work-flows where Dapps may need to receive messages from one-or-more contracts on a source chain, or to support one-sided dapp upgrades. + mapping(bytes recipient => bool isApproved) approvedSender; // Mapping is nested to support work-flows where Dapps + // may need to receive messages from one-or-more contracts on a source chain, or to support one-sided dapp upgrades. } address internal s_ccipRouter; @@ -102,7 +105,8 @@ abstract contract CCIPBase is OwnerIsCreator { } /// @notice Return whether a contract on the specified source chain is authorized to send messages to this contract through CCIP - /// @dev This function does not revert on an unapproved-sender, and should only be used as a getter-function for querying approvals from a ChainConfig object. The isValidSender modifier should be used instead for incoming message-validation + /// @dev This function does not revert on an unapproved-sender, and should only be used as a getter-function for + /// querying approvals from a ChainConfig object. The isValidSender modifier should be used instead for incoming message-validation /// @param sourceChainSelector A unique CCIP-specific identifier for the source chain /// @param senderAddr The address which sent the message on the source chain, abi-encoded if evm-compatible /// @return bool Whether the address is approved or not to invoke functions on this contract @@ -118,12 +122,13 @@ abstract contract CCIPBase is OwnerIsCreator { /// @dev All the example applications accept prefunding. This function should be removed if prefunding in native fee token is not required. receive() external payable {} - /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error or withdraw any fee-tokens which were sent as a source of fee-token pre-funding + /// @notice Allow the owner to recover any ERC-20 tokens sent to this contract out of error or withdraw any fee-tokens + /// which were sent as a source of fee-token pre-funding /// @dev This should NOT be used for recovering tokens from a failed message. Token recoveries can happen only if /// the failed message is guaranteed to not succeed upon retry, otherwise this can lead to double spend. /// For implementation of token recovery, see inheriting contracts. /// @param to A payable address to send the recovered tokens to - /// @param amount the amount of native tokens to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { + /// @param amount the amount of tokens (or native) to recover, denominated in wei function withdrawTokens(address token, address to, uint256 amount) external onlyOwner { if (token == address(0)) { payable(to).sendValue(amount); @@ -177,8 +182,7 @@ abstract contract CCIPBase is OwnerIsCreator { /// @notice Reverts if the specified chainSelector is not approved to send/receive messages to/from this contract /// @param chainSelector the CCIP specific chain selector for a given remote-chain. modifier isValidChain(uint64 chainSelector) { - ChainConfig storage currentConfig = s_chainConfigs[chainSelector]; // Must be storage because the nested mapping cannot be copied to memory - if (currentConfig.recipient.length == 0) revert InvalidChain(chainSelector); + if (s_chainConfigs[chainSelector].recipient.length == 0) revert InvalidChain(chainSelector); _; } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol index 929e9d4702..36f9cfc52b 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClient.sol @@ -15,20 +15,20 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ contract CCIPClient is CCIPReceiver { using SafeERC20 for IERC20; - IERC20 public s_feeToken; - event MessageSent(bytes32 messageId); event FeeTokenUpdated(address oldFeeToken, address newFeeToken); - bool public immutable i_isPreFunded; + IERC20 internal s_feeToken; + bool internal immutable i_isPreFunded; /// @dev A check for the zero-address is not explicitly performed since it is included in the CCIPBase parent constructor + /// @param feeToken An ERC20-compatible token, address(0) if fees should be paid in native tokens instead. constructor(address router, IERC20 feeToken, bool usePreFunding) CCIPReceiver(router) { s_feeToken = feeToken; i_isPreFunded = usePreFunding; if (address(feeToken) != address(0)) { - IERC20(s_feeToken).safeApprove(s_ccipRouter, type(uint256).max); + IERC20(feeToken).safeApprove(s_ccipRouter, type(uint256).max); } } @@ -53,7 +53,7 @@ contract CCIPClient is CCIPReceiver { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - if (!i_isPreFunded && address(s_feeToken) != address(0)) { + if (!usePreFundedFeeTokens() && address(s_feeToken) != address(0)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } @@ -78,6 +78,8 @@ contract CCIPClient is CCIPReceiver { return messageId; } + /// @notice Update the address of the token used to pay for CCIP fees. + /// @param token the token address, the zero address should be used if fees should be paid with native tokens function updateFeeToken(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)) { @@ -94,4 +96,17 @@ contract CCIPClient is CCIPReceiver { emit FeeTokenUpdated(oldFeeToken, token); } + + /// @notice Whether or not the contract should use funds already in its posesssion to pay CCIP fees, or to + /// transfer the necessary tokens from the msg.sender + /// @return isPreFunded Returns true if fees should be paid with pre funded tokens + function usePreFundedFeeTokens() public view virtual returns (bool isPreFunded) { + return i_isPreFunded; + } + + /// @notice Retrieve the address of the fee token to be used in ccipSend() + /// @return feeToken the address of the token used to pay fees. The zero address indicates native-tokens + function getFeeToken() public view virtual returns (address feeToken) { + return address(s_feeToken); + } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol index 81d6f68f49..e439bd7c1f 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPClientWithACK.sol @@ -18,7 +18,7 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { error CannotAcknowledgeUnsentMessage(bytes32); - bool public immutable i_isPreFunded; + bool internal immutable i_isPreFunded; constructor(address router, IERC20 feeToken, bool usePreFunding) CCIPReceiverWithACK(router, feeToken) { i_isPreFunded = usePreFunding; @@ -56,7 +56,7 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { uint256 fee = IRouterClient(s_ccipRouter).getFee(destChainSelector, message); - if (!i_isPreFunded && address(s_feeToken) != address(0)) { + if (!usePreFundedFeeTokens() && address(s_feeToken) != address(0)) { IERC20(s_feeToken).safeTransferFrom(msg.sender, address(this), fee); } @@ -70,4 +70,11 @@ contract CCIPClientWithACK is CCIPReceiverWithACK { return messageId; } + + /// @notice Whether or not the contract should use funds already in its posesssion to pay CCIP fees, or to + /// transfer the necessary tokens from the msg.sender + /// @return isPreFunded Returns true if fees should be paid with pre funded tokens + function usePreFundedFeeTokens() public view virtual returns (bool isPreFunded) { + return i_isPreFunded; + } } diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index 2bc2cc87a0..be5158fb7e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -81,9 +81,9 @@ contract CCIPReceiver is CCIPBase { /// @notice Executes a message that failed initial delivery, but with different logic specifically for re-execution. /// @dev Since the function invoked _retryFailedMessage(), which is marked onlyOwner, this may only be called by the - ///Owner as well. Function will revert if the messageId was not already stored as having failed its initial execution + /// Owner as well. The function will revert if the messageId was not already stored as failed during initial execution /// @param messageId the unique ID of the CCIP-message which failed initial-execution. - function retryFailedMessage(bytes32 messageId) external { + function retryFailedMessage(bytes32 messageId) external virtual { if (!s_failedMessages.contains(messageId)) revert MessageNotFailed(messageId); // Allow developer to implement arbitrary functionality on retried messages, such as just releasing the associated diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 84e3537532..8711e71504 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -46,10 +46,11 @@ contract CCIPReceiverWithACK is CCIPReceiver { MessageType messageType; // Denotes whether the incoming message is being received for the first time, or is an acknowledgement that the initial outgoing correspondence was successfully received. } - bytes32 public constant ACK_MESSAGE_HEADER = keccak256("MESSAGE_ACKNOWLEDGED_"); + // The keccak256 hash of the string "MESSAGE_ACKNOWLEDGED_" + bytes32 public constant ACK_MESSAGE_HEADER = 0x1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b2; // Current feeToken - IERC20 public s_feeToken; + IERC20 internal s_feeToken; mapping(bytes32 messageId => MessageStatus status) public s_messageStatus; @@ -139,4 +140,10 @@ contract CCIPReceiverWithACK is CCIPReceiver { emit MessageSent(incomingMessage.messageId, ACKMessageId); } + + /// @notice returns the address of the fee token. + /// @dev the zero address indicates to pay fees in native-tokens instead. + function getFeeToken() public view virtual returns (address feeToken) { + return 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 a88c82d3d4..1e31cbd79e 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -27,7 +27,6 @@ contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; event MessageSent(bytes32 messageId); - event MessageReceived(bytes32 messageId); constructor(address router) CCIPBase(router) {} 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 a19d42771c..8838c44042 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 @@ -100,7 +100,7 @@ contract CCIPClientTest is EVM2EVMOnRampSetup { s_sender.updateFeeToken(WETH); - IERC20 newFeeToken = s_sender.s_feeToken(); + IERC20 newFeeToken = IERC20(s_sender.getFeeToken()); assertEq(address(newFeeToken), WETH); assertEq(newFeeToken.allowance(address(s_sender), address(s_sourceRouter)), type(uint256).max); assertEq(IERC20(s_sourceFeeToken).allowance(address(s_sender), address(s_sourceRouter)), 0); diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index 322cca5d46..60039ee14f 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -131,6 +131,8 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { // Make sure we give the receiver contract enough tokens like CCIP would. IERC20(token).approve(address(s_sender), type(uint256).max); + assertFalse(s_sender.usePreFundedFeeTokens(), "Not Using pre-funded fee tokens"); + Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(address(s_sender)), data: "", @@ -149,6 +151,42 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { assertEq(IERC20(token).balanceOf(OWNER), feeTokenBalanceBefore - feeTokenAmount); } + function test_ccipSend_with_NativeFeeToken_andNoDestTokens_Success() 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}); + + s_sender.updateFeeToken(address(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, + extraArgs: "", + feeToken: address(s_sourceFeeToken) + }); + + 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: "" + }); + + // Assert that native fees are paid successfully and tokens are transferred + assertEq(IERC20(token).balanceOf(OWNER), tokenBalanceBefore - amount, "Tokens were not successfully delivered"); + assertEq( + OWNER.balance, nativeFeeTokenBalanceBefore - feeTokenAmount, "Native fee tokens were not successfully forwarded" + ); + } + function test_ccipSendAndReceiveAck_in_return_Success() public { address token = address(s_sourceFeeToken); uint256 amount = 111333333777; 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 bc4a396d96..4f97cee20b 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 @@ -228,6 +228,16 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { ); } + function test_apply_InvalidChainUpdate_Revert() public { + CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); + chainUpdates[0] = + CCIPBase.ChainUpdate({chainSelector: sourceChainSelector, allowed: true, recipient: "", extraArgsBytes: ""}); + + // Revert because the recipient of an allowed chain is the zero address, which is prohibited + vm.expectRevert(abi.encodeWithSelector(CCIPBase.ZeroAddressNotAllowed.selector)); + s_receiver.applyChainUpdates(chainUpdates); + } + function test_disableChain_andRevert_onccipReceive_Revert() public { CCIPBase.ChainUpdate[] memory chainUpdates = new CCIPBase.ChainUpdate[](1); chainUpdates[0] = CCIPBase.ChainUpdate({ @@ -331,4 +341,20 @@ contract CCIPReceiverTest is EVM2EVMOnRampSetup { assertEq(OWNER.balance, balanceBefore + amount); } + + function test_retryFailedMessage_which_has_not_already_failed_Revert() public { + bytes32 messageId = keccak256("RANDOM_DATA"); + + vm.expectRevert(abi.encodeWithSelector(CCIPReceiver.MessageNotFailed.selector, messageId)); + + s_receiver.retryFailedMessage(messageId); + } + + function test_abandonFailedMessage_which_has_not_already_failed_Revert() public { + bytes32 messageId = keccak256("RANDOM_DATA"); + + vm.expectRevert(abi.encodeWithSelector(CCIPReceiver.MessageNotFailed.selector, messageId)); + + s_receiver.abandonFailedMessage(messageId, OWNER); + } } 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 4c16a441bb..1d97d141de 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 @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; import {CCIPBase} from "../../../applications/external/CCIPBase.sol"; +import {CCIPReceiver} from "../../../applications/external/CCIPReceiver.sol"; import {CCIPReceiverWithACK} from "../../../applications/external/CCIPReceiverWithACK.sol"; import {Client} from "../../../libraries/Client.sol"; @@ -165,7 +166,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { s_receiver.updateFeeToken(WETH); - IERC20 newFeeToken = s_receiver.s_feeToken(); + IERC20 newFeeToken = IERC20(s_receiver.getFeeToken()); 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); @@ -176,4 +177,53 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { assertEq(IERC20(s_sourceFeeToken).allowance(address(newReceiver), address(s_sourceRouter)), type(uint256).max); } + + function test_attemptACK_message_which_has_already_been_acknowledged_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)); + + CCIPReceiverWithACK.MessagePayload memory payload = CCIPReceiverWithACK.MessagePayload({ + version: "", + data: abi.encode(s_receiver.ACK_MESSAGE_HEADER(), 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 + }) + ); + + // Assert that the message was received and ACK'ED the first time + assertEq( + uint256(s_receiver.s_messageStatus(messageId)), + uint256(CCIPReceiverWithACK.MessageStatus.ACKNOWLEDGED), + "Ack message was not properly received" + ); + + vm.expectEmit(); + emit CCIPReceiver.MessageFailed( + messageId, abi.encodeWithSelector(CCIPReceiverWithACK.MessageAlreadyAcknowledged.selector, messageId) + ); + + s_receiver.ccipReceive( + Client.Any2EVMMessage({ + messageId: messageId, + sourceChainSelector: destChainSelector, + sender: abi.encode(address(s_receiver)), + data: abi.encode(payload), + destTokenAmounts: destTokenAmounts + }) + ); + } } From 66569ca7381bef03d88565ccac20198ac8fb0c95 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, 19 Jul 2024 16:22:05 +0000 Subject: [PATCH 56/61] Update gethwrappers --- .../ccip/generated/ccipClient/ccipClient.go | 70 ++++----- .../ccipClientWithACK/ccipClientWithACK.go | 88 ++++++------ .../generated/ccipReceiver/ccipReceiver.go | 2 +- .../ccip/generated/ccipSender/ccipSender.go | 133 +----------------- .../ping_pong_demo/ping_pong_demo.go | 88 ++++++------ .../self_funded_ping_pong.go | 88 ++++++------ ...rapper-dependency-versions-do-not-edit.txt | 16 +-- 7 files changed, 178 insertions(+), 307 deletions(-) diff --git a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go index 2942e46895..a0819d4781 100644 --- a/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go +++ b/core/gethwrappers/ccip/generated/ccipClient/ccipClient.go @@ -56,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b50604051620042f9380380620042f98339810160408190526200003491620005ef565b828033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000151565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600780549286169290911682179055821515608052159050620001485760025460075462000148916001600160a01b039182169116600019620001fc565b505050620006f6565b336001600160a01b03821603620001ab5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200027a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027891906200063e565b155b620002ee5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003469185916200034b16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200039a906001600160a01b0385169084906200041c565b805190915015620003465780806020019051810190620003bb919062000658565b620003465760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200042d848460008562000435565b949350505050565b606082471015620004985760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620004b69190620006a3565b60006040518083038185875af1925050503d8060008114620004f5576040519150601f19603f3d011682016040523d82523d6000602084013e620004fa565b606091505b5090925090506200050e8783838762000519565b979650505050505050565b606083156200058d57825160000362000585576001600160a01b0385163b620005855760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200042d565b6200042d8383815115620005a45781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620006c1565b6001600160a01b0381168114620005d657600080fd5b50565b80518015158114620005ea57600080fd5b919050565b6000806000606084860312156200060557600080fd5b83516200061281620005c0565b60208501519093506200062581620005c0565b91506200063560408501620005d9565b90509250925092565b6000602082840312156200065157600080fd5b5051919050565b6000602082840312156200066b57600080fd5b6200067682620005d9565b9392505050565b60005b838110156200069a57818101518382015260200162000680565b50506000910152565b60008251620006b78184602087016200067d565b9190910192915050565b6020815260008251806020840152620006e28160408501602087016200067d565b601f01601f19169190910160400192915050565b608051613be062000719600039600081816102040152611bca0152613be06000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063cf6730f811610074578063e89b448511610059578063e89b448514610401578063f2fde38b14610422578063ff2deec31461044257600080fd5b8063cf6730f8146103c1578063e4ca8754146103e157600080fd5b8063b0f479a1116100a5578063b0f479a114610356578063c851cc3214610381578063c89245d5146103a157600080fd5b80638da5cb5b146102ea5780639fe74e261461033657600080fd5b80636939cd971161011757806379ba5097116100fc57806379ba5097146102955780638462a2b9146102aa57806385572ffb146102ca57600080fd5b80636939cd97146102485780636d62d6331461027557600080fd5b806335f170ef1161014857806335f170ef146101c457806353d4f18a146101f25780635e35359e1461022657600080fd5b80630a9094dc1461016f5780630e958d6b146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612ab9565b61046f565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b5061018f6101bf366004612ae8565b610482565b3480156101d057600080fd5b506101e46101df366004612b6d565b6104cd565b60405161019b929190612bf8565b3480156101fe57600080fd5b5061018f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561023257600080fd5b50610246610241366004612c48565b6105f9565b005b34801561025457600080fd5b50610268610263366004612ab9565b6106ce565b60405161019b9190612ce6565b34801561028157600080fd5b50610246610290366004612d7a565b6108d9565b3480156102a157600080fd5b50610246610af0565b3480156102b657600080fd5b506102466102c5366004612df6565b610bed565b3480156102d657600080fd5b506102466102e5366004612e62565b610f2e565b3480156102f657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561034257600080fd5b50610246610351366004612e9d565b611137565b34801561036257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610311565b34801561038d57600080fd5b5061024661039c366004612edf565b6112eb565b3480156103ad57600080fd5b506102466103bc366004612edf565b6113b7565b3480156103cd57600080fd5b506102466103dc366004612e62565b611521565b3480156103ed57600080fd5b506102466103fc366004612ab9565b61165d565b61041461040f366004613031565b61192b565b60405190815260200161019b565b34801561042e57600080fd5b5061024661043d366004612edf565b611e67565b34801561044e57600080fd5b506007546103119073ffffffffffffffffffffffffffffffffffffffff1681565b600061047c600583611e7b565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906104b1908590859061313e565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104e89061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546105149061314e565b80156105615780601f1061053657610100808354040283529160200191610561565b820191906000526020600020905b81548152906001019060200180831161054457829003601f168201915b5050505050908060010180546105769061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546105a29061314e565b80156105ef5780601f106105c4576101008083540402835291602001916105ef565b820191906000526020600020905b8154815290600101906020018083116105d257829003601f168201915b5050505050905082565b610601611e96565b73ffffffffffffffffffffffffffffffffffffffff83166106415761063c73ffffffffffffffffffffffffffffffffffffffff831682611f19565b610662565b61066273ffffffffffffffffffffffffffffffffffffffff84168383612073565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106c191815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161073d9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546107699061314e565b80156107b65780601f1061078b576101008083540402835291602001916107b6565b820191906000526020600020905b81548152906001019060200180831161079957829003601f168201915b505050505081526020016003820180546107cf9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb9061314e565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108cb5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610876565b505050915250909392505050565b6108e1611e96565b6108ec600583611e7b565b61092a576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b828210156109ab5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610956565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506109fb6002830182612a07565b610a09600383016000612a07565b610a17600483016000612a41565b50610a259050600584612147565b5060005b8151811015610a9f57610a9783838381518110610a4857610a486131a1565b602002602001015160200151848481518110610a6657610a666131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166120739092919063ffffffff16565b600101610a29565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610921565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610bf5611e96565b60005b81811015610d885760036000848484818110610c1657610c166131a1565b9050602002810190610c2891906131d0565b610c36906020810190612b6d565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c6d57610c6d6131a1565b9050602002810190610c7f91906131d0565b610c8d90602081019061320e565b604051610c9b92919061313e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ce257610ce26131a1565b9050602002810190610cf491906131d0565b610d0290602081019061320e565b604051610d1092919061313e565b6040518091039020838383818110610d2a57610d2a6131a1565b9050602002810190610d3c91906131d0565b610d4a906020810190612b6d565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610bf8565b5060005b83811015610f2757600160036000878785818110610dac57610dac6131a1565b9050602002810190610dbe91906131d0565b610dcc906020810190612b6d565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e0357610e036131a1565b9050602002810190610e1591906131d0565b610e2390602081019061320e565b604051610e3192919061313e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610e8157610e816131a1565b9050602002810190610e9391906131d0565b610ea190602081019061320e565b604051610eaf92919061313e565b6040518091039020858583818110610ec957610ec96131a1565b9050602002810190610edb91906131d0565b610ee9906020810190612b6d565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610d8c565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610f81576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610921565b610f916040820160208301612b6d565b67ffffffffffffffff8116600090815260036020526040902080548190610fb79061314e565b9050600003610ffe576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610921565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061103a908690600401613375565b600060405180830381600087803b15801561105457600080fd5b505af1925050508015611065575060015b611105573d808015611093576040519150601f19603f3d011682016040523d82523d6000602084013e611098565b606091505b506110a560058535612153565b508335600090815260046020526040902084906110c2828261374f565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110f7908490613849565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61113f611e96565b60005b8181101561113257600083838381811061115e5761115e6131a1565b9050602002810190611170919061385c565b6111799061389e565b905080602001516111e457805167ffffffffffffffff1660009081526003602052604081206111a791612a07565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26112e2565b806040015151600003611223576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061124e908261394f565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061127c908261394f565b50806040015160405161128f9190613a69565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516112d99190613849565b60405180910390a35b50600101611142565b6112f3611e96565b73ffffffffffffffffffffffffffffffffffffffff8116611340576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6113bf611e96565b60075473ffffffffffffffffffffffffffffffffffffffff1615611420576114206113ff60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1690600061215f565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156114cd576114cd61148d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122e1565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461155a576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156a6040820160208301612b6d565b611577604083018361320e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506115ce9250905061314e565b159050806116245750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161160f9190613a69565b9081526040519081900360200190205460ff16155b1561113257806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109219190613849565b611668600582611e7b565b6116a1576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610921565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916116e89061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546117149061314e565b80156117615780601f1061173657610100808354040283529160200191611761565b820191906000526020600020905b81548152906001019060200180831161174457829003601f168201915b5050505050815260200160038201805461177a9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546117a69061314e565b80156117f35780601f106117c8576101008083540402835291602001916117f3565b820191906000526020600020905b8154815290600101906020018083116117d657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118765760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611821565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506118c86002830182612a07565b6118d6600383016000612a07565b6118e4600483016000612a41565b506118f29050600583612147565b506118fc816123e5565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919081906119549061314e565b905060000361199b576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610921565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906119cb9061314e565b80601f01602080910402602001604051908101604052809291908181526020018280546119f79061314e565b8015611a445780601f10611a1957610100808354040283529160200191611a44565b820191906000526020600020905b815481529060010190602001808311611a2757829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611aa59061314e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad19061314e565b8015611b1e5780601f10611af357610100808354040283529160200191611b1e565b820191906000526020600020905b815481529060010190602001808311611b0157829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611b85908b908690600401613a7b565b602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190613b48565b90507f0000000000000000000000000000000000000000000000000000000000000000158015611c0d575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15611c3757600754611c379073ffffffffffffffffffffffffffffffffffffffff16333084612457565b60005b8751811015611d8a57611caa33308a8481518110611c5a57611c5a6131a1565b6020026020010151602001518b8581518110611c7857611c786131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612457909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110611cda57611cda6131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611d82576002548851611d829173ffffffffffffffffffffffffffffffffffffffff16908a9084908110611d3357611d336131a1565b6020026020010151602001518a8481518110611d5157611d516131a1565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661215f9092919063ffffffff16565b600101611c3a565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611dbd576000611dbf565b825b8a856040518463ffffffff1660e01b8152600401611dde929190613a7b565b60206040518083038185885af1158015611dfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e219190613b48565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a85604051611e5491815260200190565b60405180910390a1505050509392505050565b611e6f611e96565b611e78816124b5565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610921565b565b80471015611f83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610921565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fdd576040519150601f19603f3d011682016040523d82523d6000602084013e611fe2565b606091505b5050905080611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610921565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111329084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125aa565b6000611e8f83836126b6565b6000611e8f83836127a9565b8015806121ff57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fd9190613b48565b155b61228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610921565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111329084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120c5565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237c9190613b48565b6123869190613b61565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506123df9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120c5565b50505050565b6123ed611e96565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612429908490600401612ce6565b600060405180830381600087803b15801561244357600080fd5b505af1158015610f27573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123df9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016120c5565b3373ffffffffffffffffffffffffffffffffffffffff821603612534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610921565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061260c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127f89092919063ffffffff16565b805190915015611132578080602001905181019061262a9190613b74565b611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610921565b6000818152600183016020526040812054801561279f5760006126da600183613b91565b85549091506000906126ee90600190613b91565b905081811461275357600086600001828154811061270e5761270e6131a1565b9060005260206000200154905080876000018481548110612731576127316131a1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061276457612764613ba4565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061047c565b600091505061047c565b60008181526001830160205260408120546127f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561047c565b50600061047c565b6060612807848460008561280f565b949350505050565b6060824710156128a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610921565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128ca9190613a69565b60006040518083038185875af1925050503d8060008114612907576040519150601f19603f3d011682016040523d82523d6000602084013e61290c565b606091505b509150915061291d87838387612928565b979650505050505050565b606083156129be5782516000036129b75773ffffffffffffffffffffffffffffffffffffffff85163b6129b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610921565b5081612807565b61280783838151156129d35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109219190613849565b508054612a139061314e565b6000825580601f10612a23575050565b601f016020900490600052602060002090810190611e789190612a62565b5080546000825560020290600052602060002090810190611e789190612a7b565b5b80821115612a775760008155600101612a63565b5090565b5b80821115612a775780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612a7c565b600060208284031215612acb57600080fd5b5035919050565b67ffffffffffffffff81168114611e7857600080fd5b600080600060408486031215612afd57600080fd5b8335612b0881612ad2565b9250602084013567ffffffffffffffff80821115612b2557600080fd5b818601915086601f830112612b3957600080fd5b813581811115612b4857600080fd5b876020828501011115612b5a57600080fd5b6020830194508093505050509250925092565b600060208284031215612b7f57600080fd5b8135611e8f81612ad2565b60005b83811015612ba5578181015183820152602001612b8d565b50506000910152565b60008151808452612bc6816020860160208601612b8a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612c0b6040830185612bae565b8281036020840152612c1d8185612bae565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e7857600080fd5b600080600060608486031215612c5d57600080fd5b8335612c6881612c26565b92506020840135612c7881612c26565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612cdb578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612c9e565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612d2060c0840182612bae565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d5c8383612bae565b925060808601519150808584030160a086015250612c1d8282612c89565b60008060408385031215612d8d57600080fd5b823591506020830135612d9f81612c26565b809150509250929050565b60008083601f840112612dbc57600080fd5b50813567ffffffffffffffff811115612dd457600080fd5b6020830191508360208260051b8501011115612def57600080fd5b9250929050565b60008060008060408587031215612e0c57600080fd5b843567ffffffffffffffff80821115612e2457600080fd5b612e3088838901612daa565b90965094506020870135915080821115612e4957600080fd5b50612e5687828801612daa565b95989497509550505050565b600060208284031215612e7457600080fd5b813567ffffffffffffffff811115612e8b57600080fd5b820160a08185031215611e8f57600080fd5b60008060208385031215612eb057600080fd5b823567ffffffffffffffff811115612ec757600080fd5b612ed385828601612daa565b90969095509350505050565b600060208284031215612ef157600080fd5b8135611e8f81612c26565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f4e57612f4e612efc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f9b57612f9b612efc565b604052919050565b600082601f830112612fb457600080fd5b813567ffffffffffffffff811115612fce57612fce612efc565b612fff60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f54565b81815284602083860101111561301457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561304657600080fd5b833561305181612ad2565b925060208481013567ffffffffffffffff8082111561306f57600080fd5b818701915087601f83011261308357600080fd5b81358181111561309557613095612efc565b6130a3848260051b01612f54565b81815260069190911b8301840190848101908a8311156130c257600080fd5b938501935b8285101561310e576040858c0312156130e05760008081fd5b6130e8612f2b565b85356130f381612c26565b815285870135878201528252604090940193908501906130c7565b96505050604087013592508083111561312657600080fd5b505061313486828701612fa3565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061316257607f821691505b60208210810361319b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261320457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261324357600080fd5b83018035915067ffffffffffffffff82111561325e57600080fd5b602001915036819003821315612def57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132a857600080fd5b830160208101925035905067ffffffffffffffff8111156132c857600080fd5b803603821315612def57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612cdb57813561334381612c26565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613330565b60208152813560208201526000602083013561339081612ad2565b67ffffffffffffffff80821660408501526133ae6040860186613273565b925060a060608601526133c560c0860184836132d7565b9250506133d56060860186613273565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261340b8583856132d7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261344457600080fd5b6020928801928301923591508382111561345d57600080fd5b8160061b360383131561346f57600080fd5b8685030160a087015261291d848284613320565b601f821115611132576000816000526020600020601f850160051c810160208610156134ac5750805b601f850160051c820191505b818110156134cb578281556001016134b8565b505050505050565b67ffffffffffffffff8311156134eb576134eb612efc565b6134ff836134f9835461314e565b83613483565b6000601f841160018114613551576000851561351b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f27565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135a05786850135825560209485019460019092019101613580565b50868210156135db577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561362781612c26565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561368d5761368d612efc565b80548382558084101561371a5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146136ce576136ce6135ed565b80861686146136df576136df6135ed565b5060008360005260206000208360011b81018760011b820191505b808210156137155782825582848301556002820191506136fa565b505050505b5060008181526020812083915b858110156134cb57613739838361361c565b6040929092019160029190910190600101613727565b8135815560018101602083013561376581612ad2565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556137a5604086018661320e565b935091506137b78383600287016134d3565b6137c4606086018661320e565b935091506137d68383600387016134d3565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261380d57600080fd5b91840191823591508082111561382257600080fd5b506020820191508060061b360382131561383b57600080fd5b6123df818360048601613674565b602081526000611e8f6020830184612bae565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261320457600080fd5b8015158114611e7857600080fd5b6000608082360312156138b057600080fd5b6040516080810167ffffffffffffffff82821081831117156138d4576138d4612efc565b81604052843591506138e582612ad2565b9082526020840135906138f782613890565b816020840152604085013591508082111561391157600080fd5b61391d36838701612fa3565b6040840152606085013591508082111561393657600080fd5b5061394336828601612fa3565b60608301525092915050565b815167ffffffffffffffff81111561396957613969612efc565b61397d81613977845461314e565b84613483565b602080601f8311600181146139d0576000841561399a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556134cb565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613a1d578886015182559484019460019091019084016139fe565b5085821015613a5957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613204818460208701612b8a565b67ffffffffffffffff83168152604060208201526000825160a06040840152613aa760e0840182612bae565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613ae38383612bae565b92506040860151915080858403016080860152613b008383612c89565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613b3e8282612bae565b9695505050505050565b600060208284031215613b5a57600080fd5b5051919050565b8082018082111561047c5761047c6135ed565b600060208284031215613b8657600080fd5b8151611e8f81613890565b8181038181111561047c5761047c6135ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usePreFundedFeeTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPreFunded\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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: "0x60a06040523480156200001157600080fd5b50604051620042e4380380620042e48339810160408190526200003491620005ec565b828033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c0816200014e565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600780549286169290911682179055821515608052159050620001455760025462000145906001600160a01b038481169116600019620001f9565b505050620006f3565b336001600160a01b03821603620001a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002775750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200024f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027591906200063b565b155b620002eb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000084565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003439185916200034816565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000397906001600160a01b03851690849062000419565b805190915015620003435780806020019051810190620003b8919062000655565b620003435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60606200042a848460008562000432565b949350505050565b606082471015620004955760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620004b39190620006a0565b60006040518083038185875af1925050503d8060008114620004f2576040519150601f19603f3d011682016040523d82523d6000602084013e620004f7565b606091505b5090925090506200050b8783838762000516565b979650505050505050565b606083156200058a57825160000362000582576001600160a01b0385163b620005825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b50816200042a565b6200042a8383815115620005a15781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620006be565b6001600160a01b0381168114620005d357600080fd5b50565b80518015158114620005e757600080fd5b919050565b6000806000606084860312156200060257600080fd5b83516200060f81620005bd565b60208501519093506200062281620005bd565b91506200063260408501620005d6565b90509250925092565b6000602082840312156200064e57600080fd5b5051919050565b6000602082840312156200066857600080fd5b6200067382620005d6565b9392505050565b60005b83811015620006975781810151838201526020016200067d565b50506000910152565b60008251620006b48184602087016200067a565b9190910192915050565b6020815260008251806020840152620006df8160408501602087016200067a565b601f01601f19169190910160400192915050565b608051613bce62000716600039600081816102700152611bb90152613bce6000f3fe6080604052600436106101635760003560e01c80638da5cb5b116100c0578063ca709a2511610074578063e4ca875411610059578063e4ca87541461040b578063e89b44851461042b578063f2fde38b1461044c57600080fd5b8063ca709a25146103c0578063cf6730f8146103eb57600080fd5b8063b0f479a1116100a5578063b0f479a114610355578063c851cc3214610380578063c89245d5146103a057600080fd5b80638da5cb5b146102e95780639fe74e261461033557600080fd5b80636d62d6331161011757806379ba5097116100fc57806379ba5097146102945780638462a2b9146102a957806385572ffb146102c957600080fd5b80636d62d6331461024157806372be9eb81461026157600080fd5b806335f170ef1161014857806335f170ef146101c45780635e35359e146101f25780636939cd971461021457600080fd5b80630a9094dc1461016f5780630e958d6b146101a457600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061018f61018a366004612aa7565b61046c565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b5061018f6101bf366004612ad6565b61047f565b3480156101d057600080fd5b506101e46101df366004612b5b565b6104ca565b60405161019b929190612be6565b3480156101fe57600080fd5b5061021261020d366004612c36565b6105f6565b005b34801561022057600080fd5b5061023461022f366004612aa7565b6106cb565b60405161019b9190612cd4565b34801561024d57600080fd5b5061021261025c366004612d68565b6108d6565b34801561026d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061018f565b3480156102a057600080fd5b50610212610aee565b3480156102b557600080fd5b506102126102c4366004612de4565b610beb565b3480156102d557600080fd5b506102126102e4366004612e50565b610f2c565b3480156102f557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b34801561034157600080fd5b50610212610350366004612e8b565b611123565b34801561036157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610310565b34801561038c57600080fd5b5061021261039b366004612ecd565b6112dc565b3480156103ac57600080fd5b506102126103bb366004612ecd565b6113a8565b3480156103cc57600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff16610310565b3480156103f757600080fd5b50610212610406366004612e50565b611512565b34801561041757600080fd5b50610212610426366004612aa7565b61164e565b61043e61043936600461301f565b61191c565b60405190815260200161019b565b34801561045857600080fd5b50610212610467366004612ecd565b611e55565b6000610479600583611e69565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906104ae908590859061312c565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906104e59061313c565b80601f01602080910402602001604051908101604052809291908181526020018280546105119061313c565b801561055e5780601f106105335761010080835404028352916020019161055e565b820191906000526020600020905b81548152906001019060200180831161054157829003601f168201915b5050505050908060010180546105739061313c565b80601f016020809104026020016040519081016040528092919081815260200182805461059f9061313c565b80156105ec5780601f106105c1576101008083540402835291602001916105ec565b820191906000526020600020905b8154815290600101906020018083116105cf57829003601f168201915b5050505050905082565b6105fe611e84565b73ffffffffffffffffffffffffffffffffffffffff831661063e5761063973ffffffffffffffffffffffffffffffffffffffff831682611f07565b61065f565b61065f73ffffffffffffffffffffffffffffffffffffffff84168383612061565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106be91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161073a9061313c565b80601f01602080910402602001604051908101604052809291908181526020018280546107669061313c565b80156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b505050505081526020016003820180546107cc9061313c565b80601f01602080910402602001604051908101604052809291908181526020018280546107f89061313c565b80156108455780601f1061081a57610100808354040283529160200191610845565b820191906000526020600020905b81548152906001019060200180831161082857829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108c85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610873565b505050915250909392505050565b6108de611e84565b6108e9600583611e69565b610927576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b828210156109a85760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610953565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506109f860028301826129f5565b610a066003830160006129f5565b610a14600483016000612a2f565b50610a229050600584612135565b5060005b8151811015610a9c57610a9483838381518110610a4557610a4561318f565b602002602001015160200151848481518110610a6357610a6361318f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166120619092919063ffffffff16565b600101610a26565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161091e565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610bf3611e84565b60005b81811015610d865760036000848484818110610c1457610c1461318f565b9050602002810190610c2691906131be565b610c34906020810190612b5b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c6b57610c6b61318f565b9050602002810190610c7d91906131be565b610c8b9060208101906131fc565b604051610c9992919061312c565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610ce057610ce061318f565b9050602002810190610cf291906131be565b610d009060208101906131fc565b604051610d0e92919061312c565b6040518091039020838383818110610d2857610d2861318f565b9050602002810190610d3a91906131be565b610d48906020810190612b5b565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610bf6565b5060005b83811015610f2557600160036000878785818110610daa57610daa61318f565b9050602002810190610dbc91906131be565b610dca906020810190612b5b565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e0157610e0161318f565b9050602002810190610e1391906131be565b610e219060208101906131fc565b604051610e2f92919061312c565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610e7f57610e7f61318f565b9050602002810190610e9191906131be565b610e9f9060208101906131fc565b604051610ead92919061312c565b6040518091039020858583818110610ec757610ec761318f565b9050602002810190610ed991906131be565b610ee7906020810190612b5b565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610d8a565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610f7f576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161091e565b610f8f6040820160208301612b5b565b67ffffffffffffffff811660009081526003602052604090208054610fb39061313c565b9050600003610ffa576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161091e565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611036908590600401613363565b600060405180830381600087803b15801561105057600080fd5b505af1925050508015611061575060015b6110f3573d80801561108f576040519150601f19603f3d011682016040523d82523d6000602084013e611094565b606091505b506110a160058435612141565b508235600090815260046020526040902083906110be828261373d565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610ae1908490613837565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b61112b611e84565b60005b818110156112d757600083838381811061114a5761114a61318f565b905060200281019061115c919061384a565b6111659061388c565b905080602001516111d057805167ffffffffffffffff166000908152600360205260408120611193916129f5565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26112ce565b80604001515160000361120f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061123a908261393d565b506060810151815167ffffffffffffffff16600090815260036020526040902060010190611268908261393d565b50806040015160405161127b9190613a57565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516112c59190613837565b60405180910390a35b5060010161112e565b505050565b6112e4611e84565b73ffffffffffffffffffffffffffffffffffffffff8116611331576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6113b0611e84565b60075473ffffffffffffffffffffffffffffffffffffffff1615611411576114116113f060025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1690600061214d565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156114be576114be61147e60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122cf565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b33301461154b576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61155b6040820160208301612b5b565b61156860408301836131fc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506115bf9250905061313c565b159050806116155750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116009190613a57565b9081526040519081900360200190205460ff16155b156112d757806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161091e9190613837565b611659600582611e69565b611692576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161091e565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916116d99061313c565b80601f01602080910402602001604051908101604052809291908181526020018280546117059061313c565b80156117525780601f1061172757610100808354040283529160200191611752565b820191906000526020600020905b81548152906001019060200180831161173557829003601f168201915b5050505050815260200160038201805461176b9061313c565b80601f01602080910402602001604051908101604052809291908181526020018280546117979061313c565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156118675760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611812565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506118b960028301826129f5565b6118c76003830160006129f5565b6118d5600483016000612a2f565b506118e39050600583612135565b506118ed816123d3565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591906119439061313c565b905060000361198a576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161091e565b6040805160a08101825267ffffffffffffffff87166000908152600360205291822080548291906119ba9061313c565b80601f01602080910402602001604051908101604052809291908181526020018280546119e69061313c565b8015611a335780601f10611a0857610100808354040283529160200191611a33565b820191906000526020600020905b815481529060010190602001808311611a1657829003601f168201915b50505091835250506020808201879052604080830189905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8a166000908152600390925290206001018054608090920191611a949061313c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac09061313c565b8015611b0d5780601f10611ae257610100808354040283529160200191611b0d565b820191906000526020600020905b815481529060010190602001808311611af057829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611b74908a908690600401613a69565b602060405180830381865afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190613b36565b90507f0000000000000000000000000000000000000000000000000000000000000000158015611bfc575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15611c2657600754611c269073ffffffffffffffffffffffffffffffffffffffff16333084612445565b60005b8651811015611d7957611c993330898481518110611c4957611c4961318f565b6020026020010151602001518a8581518110611c6757611c6761318f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612445909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611cc957611cc961318f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611d71576002548751611d719173ffffffffffffffffffffffffffffffffffffffff1690899084908110611d2257611d2261318f565b602002602001015160200151898481518110611d4057611d4061318f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661214d9092919063ffffffff16565b600101611c29565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611dac576000611dae565b825b89856040518463ffffffff1660e01b8152600401611dcd929190613a69565b60206040518083038185885af1158015611deb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e109190613b36565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a84604051611e4391815260200190565b60405180910390a15050509392505050565b611e5d611e84565b611e66816124a3565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161091e565b565b80471015611f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161091e565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fcb576040519150601f19603f3d011682016040523d82523d6000602084013e611fd0565b606091505b50509050806112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161091e565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112d79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612598565b6000611e7d83836126a4565b6000611e7d8383612797565b8015806121ed57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121eb9190613b36565b155b612279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161091e565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112d79084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120b3565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236a9190613b36565b6123749190613b4f565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506123cd9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120b3565b50505050565b6123db611e84565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612417908490600401612cd4565b600060405180830381600087803b15801561243157600080fd5b505af1158015610f25573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526123cd9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016120b3565b3373ffffffffffffffffffffffffffffffffffffffff821603612522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161091e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006125fa826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127e69092919063ffffffff16565b8051909150156112d757808060200190518101906126189190613b62565b6112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161091e565b6000818152600183016020526040812054801561278d5760006126c8600183613b7f565b85549091506000906126dc90600190613b7f565b90508181146127415760008660000182815481106126fc576126fc61318f565b906000526020600020015490508087600001848154811061271f5761271f61318f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061275257612752613b92565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610479565b6000915050610479565b60008181526001830160205260408120546127de57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610479565b506000610479565b60606127f584846000856127fd565b949350505050565b60608247101561288f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161091e565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128b89190613a57565b60006040518083038185875af1925050503d80600081146128f5576040519150601f19603f3d011682016040523d82523d6000602084013e6128fa565b606091505b509150915061290b87838387612916565b979650505050505050565b606083156129ac5782516000036129a55773ffffffffffffffffffffffffffffffffffffffff85163b6129a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161091e565b50816127f5565b6127f583838151156129c15781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e9190613837565b508054612a019061313c565b6000825580601f10612a11575050565b601f016020900490600052602060002090810190611e669190612a50565b5080546000825560020290600052602060002090810190611e669190612a69565b5b80821115612a655760008155600101612a51565b5090565b5b80821115612a655780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612a6a565b600060208284031215612ab957600080fd5b5035919050565b67ffffffffffffffff81168114611e6657600080fd5b600080600060408486031215612aeb57600080fd5b8335612af681612ac0565b9250602084013567ffffffffffffffff80821115612b1357600080fd5b818601915086601f830112612b2757600080fd5b813581811115612b3657600080fd5b876020828501011115612b4857600080fd5b6020830194508093505050509250925092565b600060208284031215612b6d57600080fd5b8135611e7d81612ac0565b60005b83811015612b93578181015183820152602001612b7b565b50506000910152565b60008151808452612bb4816020860160208601612b78565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612bf96040830185612b9c565b8281036020840152612c0b8185612b9c565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e6657600080fd5b600080600060608486031215612c4b57600080fd5b8335612c5681612c14565b92506020840135612c6681612c14565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612cc9578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612c8c565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612d0e60c0840182612b9c565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d4a8383612b9c565b925060808601519150808584030160a086015250612c0b8282612c77565b60008060408385031215612d7b57600080fd5b823591506020830135612d8d81612c14565b809150509250929050565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b6020830191508360208260051b8501011115612ddd57600080fd5b9250929050565b60008060008060408587031215612dfa57600080fd5b843567ffffffffffffffff80821115612e1257600080fd5b612e1e88838901612d98565b90965094506020870135915080821115612e3757600080fd5b50612e4487828801612d98565b95989497509550505050565b600060208284031215612e6257600080fd5b813567ffffffffffffffff811115612e7957600080fd5b820160a08185031215611e7d57600080fd5b60008060208385031215612e9e57600080fd5b823567ffffffffffffffff811115612eb557600080fd5b612ec185828601612d98565b90969095509350505050565b600060208284031215612edf57600080fd5b8135611e7d81612c14565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612f3c57612f3c612eea565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f8957612f89612eea565b604052919050565b600082601f830112612fa257600080fd5b813567ffffffffffffffff811115612fbc57612fbc612eea565b612fed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f42565b81815284602083860101111561300257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561303457600080fd5b833561303f81612ac0565b925060208481013567ffffffffffffffff8082111561305d57600080fd5b818701915087601f83011261307157600080fd5b81358181111561308357613083612eea565b613091848260051b01612f42565b81815260069190911b8301840190848101908a8311156130b057600080fd5b938501935b828510156130fc576040858c0312156130ce5760008081fd5b6130d6612f19565b85356130e181612c14565b815285870135878201528252604090940193908501906130b5565b96505050604087013592508083111561311457600080fd5b505061312286828701612f91565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061315057607f821691505b602082108103613189577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126131f257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261323157600080fd5b83018035915067ffffffffffffffff82111561324c57600080fd5b602001915036819003821315612ddd57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261329657600080fd5b830160208101925035905067ffffffffffffffff8111156132b657600080fd5b803603821315612ddd57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612cc957813561333181612c14565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161331e565b60208152813560208201526000602083013561337e81612ac0565b67ffffffffffffffff808216604085015261339c6040860186613261565b925060a060608601526133b360c0860184836132c5565b9250506133c36060860186613261565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526133f98583856132c5565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261343257600080fd5b6020928801928301923591508382111561344b57600080fd5b8160061b360383131561345d57600080fd5b8685030160a087015261290b84828461330e565b601f8211156112d7576000816000526020600020601f850160051c8101602086101561349a5750805b601f850160051c820191505b818110156134b9578281556001016134a6565b505050505050565b67ffffffffffffffff8311156134d9576134d9612eea565b6134ed836134e7835461313c565b83613471565b6000601f84116001811461353f57600085156135095750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f25565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561358e578685013582556020948501946001909201910161356e565b50868210156135c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561361581612c14565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561367b5761367b612eea565b8054838255808410156137085760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146136bc576136bc6135db565b80861686146136cd576136cd6135db565b5060008360005260206000208360011b81018760011b820191505b808210156137035782825582848301556002820191506136e8565b505050505b5060008181526020812083915b858110156134b957613727838361360a565b6040929092019160029190910190600101613715565b8135815560018101602083013561375381612ac0565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561379360408601866131fc565b935091506137a58383600287016134c1565b6137b260608601866131fc565b935091506137c48383600387016134c1565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030183126137fb57600080fd5b91840191823591508082111561381057600080fd5b506020820191508060061b360382131561382957600080fd5b6123cd818360048601613662565b602081526000611e7d6020830184612b9c565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126131f257600080fd5b8015158114611e6657600080fd5b60006080823603121561389e57600080fd5b6040516080810167ffffffffffffffff82821081831117156138c2576138c2612eea565b81604052843591506138d382612ac0565b9082526020840135906138e58261387e565b81602084015260408501359150808211156138ff57600080fd5b61390b36838701612f91565b6040840152606085013591508082111561392457600080fd5b5061393136828601612f91565b60608301525092915050565b815167ffffffffffffffff81111561395757613957612eea565b61396b81613965845461313c565b84613471565b602080601f8311600181146139be57600084156139885750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556134b9565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613a0b578886015182559484019460019091019084016139ec565b5085821015613a4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516131f2818460208701612b78565b67ffffffffffffffff83168152604060208201526000825160a06040840152613a9560e0840182612b9c565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613ad18383612b9c565b92506040860151915080858403016080860152613aee8383612c77565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613b2c8282612b9c565b9695505050505050565b600060208284031215613b4857600080fd5b5051919050565b80820180821115610479576104796135db565b600060208284031215613b7457600080fd5b8151611e7d8161387e565b81810381811115610479576104796135db565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientABI = CCIPClientMetaData.ABI @@ -196,6 +196,28 @@ func (_CCIPClient *CCIPClientTransactorRaw) Transact(opts *bind.TransactOpts, me return _CCIPClient.Contract.contract.Transact(opts, method, params...) } +func (_CCIPClient *CCIPClientCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClient.contract.Call(opts, &out, "getFeeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPClient *CCIPClientSession) GetFeeToken() (common.Address, error) { + return _CCIPClient.Contract.GetFeeToken(&_CCIPClient.CallOpts) +} + +func (_CCIPClient *CCIPClientCallerSession) GetFeeToken() (common.Address, error) { + return _CCIPClient.Contract.GetFeeToken(&_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) @@ -240,28 +262,6 @@ func (_CCIPClient *CCIPClientCallerSession) GetRouter() (common.Address, error) return _CCIPClient.Contract.GetRouter(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "i_isPreFunded") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_CCIPClient *CCIPClientSession) IIsPreFunded() (bool, error) { - return _CCIPClient.Contract.IIsPreFunded(&_CCIPClient.CallOpts) -} - -func (_CCIPClient *CCIPClientCallerSession) IIsPreFunded() (bool, error) { - return _CCIPClient.Contract.IIsPreFunded(&_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) @@ -358,26 +358,26 @@ func (_CCIPClient *CCIPClientCallerSession) SChainConfigs(destChainSelector uint return _CCIPClient.Contract.SChainConfigs(&_CCIPClient.CallOpts, destChainSelector) } -func (_CCIPClient *CCIPClientCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_CCIPClient *CCIPClientCaller) UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, error) { var out []interface{} - err := _CCIPClient.contract.Call(opts, &out, "s_feeToken") + err := _CCIPClient.contract.Call(opts, &out, "usePreFundedFeeTokens") if err != nil { - return *new(common.Address), err + return *new(bool), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err } -func (_CCIPClient *CCIPClientSession) SFeeToken() (common.Address, error) { - return _CCIPClient.Contract.SFeeToken(&_CCIPClient.CallOpts) +func (_CCIPClient *CCIPClientSession) UsePreFundedFeeTokens() (bool, error) { + return _CCIPClient.Contract.UsePreFundedFeeTokens(&_CCIPClient.CallOpts) } -func (_CCIPClient *CCIPClientCallerSession) SFeeToken() (common.Address, error) { - return _CCIPClient.Contract.SFeeToken(&_CCIPClient.CallOpts) +func (_CCIPClient *CCIPClientCallerSession) UsePreFundedFeeTokens() (bool, error) { + return _CCIPClient.Contract.UsePreFundedFeeTokens(&_CCIPClient.CallOpts) } func (_CCIPClient *CCIPClientTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { @@ -2464,12 +2464,12 @@ func (_CCIPClient *CCIPClient) Address() common.Address { } type CCIPClientInterface interface { + GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) GetRouter(opts *bind.CallOpts) (common.Address, error) - IIsPreFunded(opts *bind.CallOpts) (bool, error) - IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -2480,7 +2480,7 @@ type CCIPClientInterface interface { error) - SFeeToken(opts *bind.CallOpts) (common.Address, error) + UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go index bbeb32187a..5fa09c5c92 100644 --- a/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go +++ b/core/gethwrappers/ccip/generated/ccipClientWithACK/ccipClientWithACK.go @@ -56,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPClientWithACKMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b50604051620049f5380380620049f5833981016040819052620000349162000585565b8282818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200014b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f6565b5050151560805250620006b49050565b336001600160a01b03821603620001a55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000248573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026e9190620005d4565b6200027a9190620005ee565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d691869190620002dc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032b906001600160a01b038516908490620003b2565b805190915015620003ad57808060200190518101906200034c919062000616565b620003ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003c38484600085620003cb565b949350505050565b6060824710156200042e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044c919062000661565b60006040518083038185875af1925050503d80600081146200048b576040519150601f19603f3d011682016040523d82523d6000602084013e62000490565b606091505b509092509050620004a487838387620004af565b979650505050505050565b60608315620005235782516000036200051b576001600160a01b0385163b6200051b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003c3565b620003c383838151156200053a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200067f565b6001600160a01b03811681146200056c57600080fd5b50565b805180151581146200058057600080fd5b919050565b6000806000606084860312156200059b57600080fd5b8351620005a88162000556565b6020850151909350620005bb8162000556565b9150620005cb604085016200056f565b90509250925092565b600060208284031215620005e757600080fd5b5051919050565b808201808211156200061057634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200062957600080fd5b62000634826200056f565b9392505050565b60005b83811015620006585781810151838201526020016200063e565b50506000910152565b60008251620006758184602087016200063b565b9190910192915050565b6020815260008251806020840152620006a08160408501602087016200063b565b601f01601f19169190910160400192915050565b60805161431e620006d76000396000818161025b0152611f60015261431e6000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e89b448511610059578063e89b44851461049a578063f2fde38b146104ad578063ff2deec3146104cd57600080fd5b8063c89245d51461043a578063cf6730f81461045a578063e4ca87541461047a57600080fd5b80639fe74e26116100b05780639fe74e26146103cf578063b0f479a1146103ef578063c851cc321461041a57600080fd5b806385572ffb146103635780638da5cb5b1461038357600080fd5b80635e35359e1161012d5780636fef519e116101075780636fef519e146102ec57806379ba50971461032e5780638462a2b91461034357600080fd5b80635e35359e1461027d5780636939cd971461029f5780636d62d633146102cc57600080fd5b80630e958d6b1161015e5780630e958d6b146101fb57806335f170ef1461021b57806353d4f18a1461024957600080fd5b806305bfe982146101855780630a9094dc146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a0366004613094565b60086020526000908152604090205460ff1681565b6040516101c291906130dc565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613094565b6104fa565b60405190151581526020016101c2565b34801561020757600080fd5b506101eb610216366004613133565b61050d565b34801561022757600080fd5b5061023b6102363660046131b8565b610558565b6040516101c2929190613243565b34801561025557600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561028957600080fd5b5061029d610298366004613293565b610684565b005b3480156102ab57600080fd5b506102bf6102ba366004613094565b610759565b6040516101c29190613331565b3480156102d857600080fd5b5061029d6102e73660046133c5565b610964565b3480156102f857600080fd5b506103207f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b281565b6040519081526020016101c2565b34801561033a57600080fd5b5061029d610b7b565b34801561034f57600080fd5b5061029d61035e366004613441565b610c78565b34801561036f57600080fd5b5061029d61037e3660046134ad565b610fb9565b34801561038f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103db57600080fd5b5061029d6103ea3660046134e8565b6111c2565b3480156103fb57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103aa565b34801561042657600080fd5b5061029d61043536600461352a565b611376565b34801561044657600080fd5b5061029d61045536600461352a565b611442565b34801561046657600080fd5b5061029d6104753660046134ad565b6115b6565b34801561048657600080fd5b5061029d610495366004613094565b6118a3565b6103206104a836600461369f565b611b71565b3480156104b957600080fd5b5061029d6104c836600461352a565b6120d2565b3480156104d957600080fd5b506007546103aa9073ffffffffffffffffffffffffffffffffffffffff1681565b60006105076005836120e6565b92915050565b67ffffffffffffffff8316600090815260036020526040808220905160029091019061053c90859085906137ac565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610573906137bc565b80601f016020809104026020016040519081016040528092919081815260200182805461059f906137bc565b80156105ec5780601f106105c1576101008083540402835291602001916105ec565b820191906000526020600020905b8154815290600101906020018083116105cf57829003601f168201915b505050505090806001018054610601906137bc565b80601f016020809104026020016040519081016040528092919081815260200182805461062d906137bc565b801561067a5780601f1061064f5761010080835404028352916020019161067a565b820191906000526020600020905b81548152906001019060200180831161065d57829003601f168201915b5050505050905082565b61068c612101565b73ffffffffffffffffffffffffffffffffffffffff83166106cc576106c773ffffffffffffffffffffffffffffffffffffffff831682612184565b6106ed565b6106ed73ffffffffffffffffffffffffffffffffffffffff841683836122de565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161074c91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107c8906137bc565b80601f01602080910402602001604051908101604052809291908181526020018280546107f4906137bc565b80156108415780601f1061081657610100808354040283529160200191610841565b820191906000526020600020905b81548152906001019060200180831161082457829003601f168201915b5050505050815260200160038201805461085a906137bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610886906137bc565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109565760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610901565b505050915250909392505050565b61096c612101565b6109776005836120e6565b6109b5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a365760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109e1565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a866002830182612fe2565b610a94600383016000612fe2565b610aa260048301600061301c565b50610ab090506005846123b2565b5060005b8151811015610b2a57610b2283838381518110610ad357610ad361380f565b602002602001015160200151848481518110610af157610af161380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122de9092919063ffffffff16565b600101610ab4565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109ac565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c80612101565b60005b81811015610e135760036000848484818110610ca157610ca161380f565b9050602002810190610cb3919061383e565b610cc19060208101906131b8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610cf857610cf861380f565b9050602002810190610d0a919061383e565b610d1890602081019061387c565b604051610d269291906137ac565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d6d57610d6d61380f565b9050602002810190610d7f919061383e565b610d8d90602081019061387c565b604051610d9b9291906137ac565b6040518091039020838383818110610db557610db561380f565b9050602002810190610dc7919061383e565b610dd59060208101906131b8565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c83565b5060005b83811015610fb257600160036000878785818110610e3757610e3761380f565b9050602002810190610e49919061383e565b610e579060208101906131b8565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e8e57610e8e61380f565b9050602002810190610ea0919061383e565b610eae90602081019061387c565b604051610ebc9291906137ac565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f0c57610f0c61380f565b9050602002810190610f1e919061383e565b610f2c90602081019061387c565b604051610f3a9291906137ac565b6040518091039020858583818110610f5457610f5461380f565b9050602002810190610f66919061383e565b610f749060208101906131b8565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e17565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461100c576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109ac565b61101c60408201602083016131b8565b67ffffffffffffffff8116600090815260036020526040902080548190611042906137bc565b9050600003611089576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109ac565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110c59086906004016139e3565b600060405180830381600087803b1580156110df57600080fd5b505af19250505080156110f0575060015b611190573d80801561111e576040519150601f19603f3d011682016040523d82523d6000602084013e611123565b606091505b50611130600585356123be565b5083356000908152600460205260409020849061114d8282613dbd565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90611182908490613eb7565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6111ca612101565b60005b818110156111bd5760008383838181106111e9576111e961380f565b90506020028101906111fb9190613eca565b61120490613f0c565b9050806020015161126f57805167ffffffffffffffff16600090815260036020526040812061123291612fe2565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a261136d565b8060400151516000036112ae576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112d99082613fbd565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906113079082613fbd565b50806040015160405161131a91906140d7565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516113649190613eb7565b60405180910390a35b506001016111cd565b61137e612101565b73ffffffffffffffffffffffffffffffffffffffff81166113cb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61144a612101565b60075473ffffffffffffffffffffffffffffffffffffffff16156114ab576114ab61148a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006123ca565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115585761155861151860025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61254c565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146115ef576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ff60408201602083016131b8565b61160c604083018361387c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611663925090506137bc565b159050806116b95750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516116a491906140d7565b9081526040519081900360200190205460ff16155b156116f257806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109ac9190613eb7565b6000611701606085018561387c565b81019061170e91906140e9565b9050600081604001516001811115611728576117286130ad565b0361173c576117368461264a565b50505050565b600181604001516001811115611754576117546130ad565b036117365760008082602001518060200190518101906117749190614195565b915091507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b282146117d1576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff1660028111156117f6576117f66130ad565b03611830576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109ac565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b6118ae6005826120e6565b6118e7576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109ac565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161192e906137bc565b80601f016020809104026020016040519081016040528092919081815260200182805461195a906137bc565b80156119a75780601f1061197c576101008083540402835291602001916119a7565b820191906000526020600020905b81548152906001019060200180831161198a57829003601f168201915b505050505081526020016003820180546119c0906137bc565b80601f01602080910402602001604051908101604052809291908181526020018280546119ec906137bc565b8015611a395780601f10611a0e57610100808354040283529160200191611a39565b820191906000526020600020905b815481529060010190602001808311611a1c57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611abc5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611a67565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b0e6002830182612fe2565b611b1c600383016000612fe2565b611b2a60048301600061301c565b50611b3890506005836123b2565b50611b42816129c0565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611b9a906137bc565b9050600003611be1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109ac565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611c11906137bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3d906137bc565b8015611c8a5780601f10611c5f57610100808354040283529160200191611c8a565b820191906000526020600020905b815481529060010190602001808311611c6d57829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611ceb906137bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611d17906137bc565b8015611d645780601f10611d3957610100808354040283529160200191611d64565b820191906000526020600020905b815481529060010190602001808311611d4757829003601f168201915b5050505050815250905060005b8651811015611ec157611de13330898481518110611d9157611d9161380f565b6020026020010151602001518a8581518110611daf57611daf61380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a32909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff90911690889083908110611e1157611e1161380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611eb9576002548751611eb99173ffffffffffffffffffffffffffffffffffffffff1690899084908110611e6a57611e6a61380f565b602002602001015160200151898481518110611e8857611e8861380f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123ca9092919063ffffffff16565b600101611d71565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611f1b908b9086906004016141b9565b602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c9190614286565b90507f0000000000000000000000000000000000000000000000000000000000000000158015611fa3575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15611fcd57600754611fcd9073ffffffffffffffffffffffffffffffffffffffff16333084612a32565b60025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611fff576000612001565b825b8a856040518463ffffffff1660e01b81526004016120209291906141b9565b60206040518083038185885af115801561203e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120639190614286565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519196509086907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a3505050509392505050565b6120da612101565b6120e381612a90565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109ac565b565b804710156121ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ac565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612248576040519150601f19603f3d011682016040523d82523d6000602084013e61224d565b606091505b50509050806111bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ac565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111bd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b85565b60006120fa8383612c91565b60006120fa8383612d84565b80158061246a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124689190614286565b155b6124f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109ac565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111bd9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612330565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e79190614286565b6125f1919061429f565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117369085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612330565b60006040518060a00160405280838060400190612667919061387c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040516020918201916126df917f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b29187359101918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561275957816020015b60408051808201909152600080825260208201528152602001906001900390816127325790505b50815260075473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604091820191600391600091612799919088019088016131b8565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546127c9906137bc565b80601f01602080910402602001604051908101604052809291908181526020018280546127f5906137bc565b80156128425780601f1061281757610100808354040283529160200191612842565b820191906000526020600020905b81548152906001019060200180831161282557829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded61287f60408601602087016131b8565b846040518363ffffffff1660e01b815260040161289d9291906141b9565b602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de9190614286565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612916576000612918565b835b61292860408801602089016131b8565b866040518463ffffffff1660e01b81526004016129469291906141b9565b60206040518083038185885af1158015612964573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129899190614286565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b6129c8612101565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612a04908490600401613331565b600060405180830381600087803b158015612a1e57600080fd5b505af1158015610fb2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117369085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612330565b3373ffffffffffffffffffffffffffffffffffffffff821603612b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109ac565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612be7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612dd39092919063ffffffff16565b8051909150156111bd5780806020019051810190612c0591906142b2565b6111bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109ac565b60008181526001830160205260408120548015612d7a576000612cb56001836142cf565b8554909150600090612cc9906001906142cf565b9050818114612d2e576000866000018281548110612ce957612ce961380f565b9060005260206000200154905080876000018481548110612d0c57612d0c61380f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d3f57612d3f6142e2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610507565b6000915050610507565b6000818152600183016020526040812054612dcb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610507565b506000610507565b6060612de28484600085612dea565b949350505050565b606082471015612e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109ac565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ea591906140d7565b60006040518083038185875af1925050503d8060008114612ee2576040519150601f19603f3d011682016040523d82523d6000602084013e612ee7565b606091505b5091509150612ef887838387612f03565b979650505050505050565b60608315612f99578251600003612f925773ffffffffffffffffffffffffffffffffffffffff85163b612f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ac565b5081612de2565b612de28383815115612fae5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ac9190613eb7565b508054612fee906137bc565b6000825580601f10612ffe575050565b601f0160209004906000526020600020908101906120e3919061303d565b50805460008255600202906000526020600020908101906120e39190613056565b5b80821115613052576000815560010161303e565b5090565b5b808211156130525780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613057565b6000602082840312156130a657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613117577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146120e357600080fd5b60008060006040848603121561314857600080fd5b83356131538161311d565b9250602084013567ffffffffffffffff8082111561317057600080fd5b818601915086601f83011261318457600080fd5b81358181111561319357600080fd5b8760208285010111156131a557600080fd5b6020830194508093505050509250925092565b6000602082840312156131ca57600080fd5b81356120fa8161311d565b60005b838110156131f05781810151838201526020016131d8565b50506000910152565b600081518084526132118160208601602086016131d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061325660408301856131f9565b828103602084015261326881856131f9565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146120e357600080fd5b6000806000606084860312156132a857600080fd5b83356132b381613271565b925060208401356132c381613271565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613326578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016132e9565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261336b60c08401826131f9565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133a783836131f9565b925060808601519150808584030160a08601525061326882826132d4565b600080604083850312156133d857600080fd5b8235915060208301356133ea81613271565b809150509250929050565b60008083601f84011261340757600080fd5b50813567ffffffffffffffff81111561341f57600080fd5b6020830191508360208260051b850101111561343a57600080fd5b9250929050565b6000806000806040858703121561345757600080fd5b843567ffffffffffffffff8082111561346f57600080fd5b61347b888389016133f5565b9096509450602087013591508082111561349457600080fd5b506134a1878288016133f5565b95989497509550505050565b6000602082840312156134bf57600080fd5b813567ffffffffffffffff8111156134d657600080fd5b820160a081850312156120fa57600080fd5b600080602083850312156134fb57600080fd5b823567ffffffffffffffff81111561351257600080fd5b61351e858286016133f5565b90969095509350505050565b60006020828403121561353c57600080fd5b81356120fa81613271565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561359957613599613547565b60405290565b6040516060810167ffffffffffffffff8111828210171561359957613599613547565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561360957613609613547565b604052919050565b600082601f83011261362257600080fd5b813567ffffffffffffffff81111561363c5761363c613547565b61366d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016135c2565b81815284602083860101111561368257600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156136b457600080fd5b83356136bf8161311d565b925060208481013567ffffffffffffffff808211156136dd57600080fd5b818701915087601f8301126136f157600080fd5b81358181111561370357613703613547565b613711848260051b016135c2565b81815260069190911b8301840190848101908a83111561373057600080fd5b938501935b8285101561377c576040858c03121561374e5760008081fd5b613756613576565b853561376181613271565b81528587013587820152825260409094019390850190613735565b96505050604087013592508083111561379457600080fd5b50506137a286828701613611565b9150509250925092565b8183823760009101908152919050565b600181811c908216806137d057607f821691505b602082108103613809577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261387257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138b157600080fd5b83018035915067ffffffffffffffff8211156138cc57600080fd5b60200191503681900382131561343a57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261391657600080fd5b830160208101925035905067ffffffffffffffff81111561393657600080fd5b80360382131561343a57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133265781356139b181613271565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161399e565b6020815281356020820152600060208301356139fe8161311d565b67ffffffffffffffff8082166040850152613a1c60408601866138e1565b925060a06060860152613a3360c086018483613945565b925050613a4360608601866138e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a79858385613945565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613ab257600080fd5b60209288019283019235915083821115613acb57600080fd5b8160061b3603831315613add57600080fd5b8685030160a0870152612ef884828461398e565b601f8211156111bd576000816000526020600020601f850160051c81016020861015613b1a5750805b601f850160051c820191505b81811015613b3957828155600101613b26565b505050505050565b67ffffffffffffffff831115613b5957613b59613547565b613b6d83613b6783546137bc565b83613af1565b6000601f841160018114613bbf5760008515613b895750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fb2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613c0e5786850135825560209485019460019092019101613bee565b5086821015613c49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c9581613271565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613cfb57613cfb613547565b805483825580841015613d885760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613d3c57613d3c613c5b565b8086168614613d4d57613d4d613c5b565b5060008360005260206000208360011b81018760011b820191505b80821015613d83578282558284830155600282019150613d68565b505050505b5060008181526020812083915b85811015613b3957613da78383613c8a565b6040929092019160029190910190600101613d95565b81358155600181016020830135613dd38161311d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613e13604086018661387c565b93509150613e25838360028701613b41565b613e32606086018661387c565b93509150613e44838360038701613b41565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e7b57600080fd5b918401918235915080821115613e9057600080fd5b506020820191508060061b3603821315613ea957600080fd5b611736818360048601613ce2565b6020815260006120fa60208301846131f9565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261387257600080fd5b80151581146120e357600080fd5b600060808236031215613f1e57600080fd5b6040516080810167ffffffffffffffff8282108183111715613f4257613f42613547565b8160405284359150613f538261311d565b908252602084013590613f6582613efe565b8160208401526040850135915080821115613f7f57600080fd5b613f8b36838701613611565b60408401526060850135915080821115613fa457600080fd5b50613fb136828601613611565b60608301525092915050565b815167ffffffffffffffff811115613fd757613fd7613547565b613feb81613fe584546137bc565b84613af1565b602080601f83116001811461403e57600084156140085750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b39565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561408b5788860151825594840194600190910190840161406c565b50858210156140c757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516138728184602087016131d5565b6000602082840312156140fb57600080fd5b813567ffffffffffffffff8082111561411357600080fd5b908301906060828603121561412757600080fd5b61412f61359f565b82358281111561413e57600080fd5b61414a87828601613611565b82525060208301358281111561415f57600080fd5b61416b87828601613611565b602083015250604083013592506002831061418557600080fd5b6040810192909252509392505050565b600080604083850312156141a857600080fd5b505080516020909101519092909150565b67ffffffffffffffff83168152604060208201526000825160a060408401526141e560e08401826131f9565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261422183836131f9565b9250604086015191508085840301608086015261423e83836132d4565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061427c82826131f9565b9695505050505050565b60006020828403121561429857600080fd5b5051919050565b8082018082111561050757610507613c5b565b6000602082840312156142c457600080fd5b81516120fa81613efe565b8181038181111561050757610507613c5b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"usePreFunding\",\"type\":\"bool\"}],\"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\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usePreFundedFeeTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPreFunded\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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: "0x60a06040523480156200001157600080fd5b50604051620049e4380380620049e4833981016040819052620000349162000585565b8282818033806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200014b565b5050506001600160a01b038116620000ed576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013b576200013b6001600160a01b03821683600019620001f6565b5050151560805250620006b49050565b336001600160a01b03821603620001a55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000248573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026e9190620005d4565b6200027a9190620005ee565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002d691869190620002dc16565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200032b906001600160a01b038516908490620003b2565b805190915015620003ad57808060200190518101906200034c919062000616565b620003ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b505050565b6060620003c38484600085620003cb565b949350505050565b6060824710156200042e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b031685876040516200044c919062000661565b60006040518083038185875af1925050503d80600081146200048b576040519150601f19603f3d011682016040523d82523d6000602084013e62000490565b606091505b509092509050620004a487838387620004af565b979650505050505050565b60608315620005235782516000036200051b576001600160a01b0385163b6200051b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620003c3565b620003c383838151156200053a5781518083602001fd5b8060405162461bcd60e51b81526004016200008691906200067f565b6001600160a01b03811681146200056c57600080fd5b50565b805180151581146200058057600080fd5b919050565b6000806000606084860312156200059b57600080fd5b8351620005a88162000556565b6020850151909350620005bb8162000556565b9150620005cb604085016200056f565b90509250925092565b600060208284031215620005e757600080fd5b5051919050565b808201808211156200061057634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156200062957600080fd5b62000634826200056f565b9392505050565b60005b83811015620006585781810151838201526020016200063e565b50506000910152565b60008251620006758184602087016200063b565b9190910192915050565b6020815260008251806020840152620006a08160408501602087016200063b565b601f01601f19169190910160400192915050565b60805161430d620006d7600039600081816103090152611f50015261430d6000f3fe6080604052600436106101795760003560e01c806385572ffb116100cb578063c89245d51161007f578063e4ca875411610059578063e4ca8754146104a4578063e89b4485146104c4578063f2fde38b146104d757600080fd5b8063c89245d514610439578063ca709a2514610459578063cf6730f81461048457600080fd5b80639fe74e26116100b05780639fe74e26146103ce578063b0f479a1146103ee578063c851cc321461041957600080fd5b806385572ffb146103625780638da5cb5b1461038257600080fd5b80636939cd971161012d57806372be9eb81161010757806372be9eb8146102fa57806379ba50971461032d5780638462a2b91461034257600080fd5b80636939cd971461026b5780636d62d633146102985780636fef519e146102b857600080fd5b80630e958d6b1161015e5780630e958d6b146101fb57806335f170ef1461021b5780635e35359e1461024957600080fd5b806305bfe982146101855780630a9094dc146101cb57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101b56101a0366004613083565b60086020526000908152604090205460ff1681565b6040516101c291906130cb565b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004613083565b6104f7565b60405190151581526020016101c2565b34801561020757600080fd5b506101eb610216366004613122565b61050a565b34801561022757600080fd5b5061023b6102363660046131a7565b610555565b6040516101c2929190613232565b34801561025557600080fd5b50610269610264366004613282565b610681565b005b34801561027757600080fd5b5061028b610286366004613083565b610756565b6040516101c29190613320565b3480156102a457600080fd5b506102696102b33660046133b4565b610961565b3480156102c457600080fd5b506102ec7f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b281565b6040519081526020016101c2565b34801561030657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006101eb565b34801561033957600080fd5b50610269610b79565b34801561034e57600080fd5b5061026961035d366004613430565b610c76565b34801561036e57600080fd5b5061026961037d36600461349c565b610fb7565b34801561038e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b3480156103da57600080fd5b506102696103e93660046134d7565b6111ae565b3480156103fa57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103a9565b34801561042557600080fd5b50610269610434366004613519565b611367565b34801561044557600080fd5b50610269610454366004613519565b611433565b34801561046557600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff166103a9565b34801561049057600080fd5b5061026961049f36600461349c565b6115a7565b3480156104b057600080fd5b506102696104bf366004613083565b611895565b6102ec6104d236600461368e565b611b63565b3480156104e357600080fd5b506102696104f2366004613519565b6120c1565b60006105046005836120d5565b92915050565b67ffffffffffffffff83166000908152600360205260408082209051600290910190610539908590859061379b565b9081526040519081900360200190205460ff1690509392505050565b600360205260009081526040902080548190610570906137ab565b80601f016020809104026020016040519081016040528092919081815260200182805461059c906137ab565b80156105e95780601f106105be576101008083540402835291602001916105e9565b820191906000526020600020905b8154815290600101906020018083116105cc57829003601f168201915b5050505050908060010180546105fe906137ab565b80601f016020809104026020016040519081016040528092919081815260200182805461062a906137ab565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905082565b6106896120f0565b73ffffffffffffffffffffffffffffffffffffffff83166106c9576106c473ffffffffffffffffffffffffffffffffffffffff831682612173565b6106ea565b6106ea73ffffffffffffffffffffffffffffffffffffffff841683836122cd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161074991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107c5906137ab565b80601f01602080910402602001604051908101604052809291908181526020018280546107f1906137ab565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b50505050508152602001600382018054610857906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610883906137ab565b80156108d05780601f106108a5576101008083540402835291602001916108d0565b820191906000526020600020905b8154815290600101906020018083116108b357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156109535760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108fe565b505050915250909392505050565b6109696120f0565b6109746005836120d5565b6109b2576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610a335760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016109de565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a836002830182612fd1565b610a91600383016000612fd1565b610a9f60048301600061300b565b50610aad90506005846123a1565b5060005b8151811015610b2757610b1f83838381518110610ad057610ad06137fe565b602002602001015160200151848481518110610aee57610aee6137fe565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166122cd9092919063ffffffff16565b600101610ab1565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109a9565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c7e6120f0565b60005b81811015610e115760036000848484818110610c9f57610c9f6137fe565b9050602002810190610cb1919061382d565b610cbf9060208101906131a7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610cf657610cf66137fe565b9050602002810190610d08919061382d565b610d1690602081019061386b565b604051610d2492919061379b565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d6b57610d6b6137fe565b9050602002810190610d7d919061382d565b610d8b90602081019061386b565b604051610d9992919061379b565b6040518091039020838383818110610db357610db36137fe565b9050602002810190610dc5919061382d565b610dd39060208101906131a7565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c81565b5060005b83811015610fb057600160036000878785818110610e3557610e356137fe565b9050602002810190610e47919061382d565b610e559060208101906131a7565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e8c57610e8c6137fe565b9050602002810190610e9e919061382d565b610eac90602081019061386b565b604051610eba92919061379b565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610f0a57610f0a6137fe565b9050602002810190610f1c919061382d565b610f2a90602081019061386b565b604051610f3892919061379b565b6040518091039020858583818110610f5257610f526137fe565b9050602002810190610f64919061382d565b610f729060208101906131a7565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610e15565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461100a576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109a9565b61101a60408201602083016131a7565b67ffffffffffffffff81166000908152600360205260409020805461103e906137ab565b9050600003611085576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109a9565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906110c19085906004016139d2565b600060405180830381600087803b1580156110db57600080fd5b505af19250505080156110ec575060015b61117e573d80801561111a576040519150601f19603f3d011682016040523d82523d6000602084013e61111f565b606091505b5061112c600584356123ad565b508235600090815260046020526040902083906111498282613dac565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610b6c908490613ea6565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b6111b66120f0565b60005b818110156113625760008383838181106111d5576111d56137fe565b90506020028101906111e79190613eb9565b6111f090613efb565b9050806020015161125b57805167ffffffffffffffff16600090815260036020526040812061121e91612fd1565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611359565b80604001515160000361129a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112c59082613fac565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906112f39082613fac565b50806040015160405161130691906140c6565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516113509190613ea6565b60405180910390a35b506001016111b9565b505050565b61136f6120f0565b73ffffffffffffffffffffffffffffffffffffffff81166113bc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61143b6120f0565b60075473ffffffffffffffffffffffffffffffffffffffff161561149c5761149c61147b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006123b9565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156115495761154961150960025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61253b565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146115e0576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115f060408201602083016131a7565b6115fd604083018361386b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611654925090506137ab565b159050806116aa5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161169591906140c6565b9081526040519081900360200190205460ff16155b156116e357806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109a99190613ea6565b60006116f2606085018561386b565b8101906116ff91906140d8565b90506000816040015160018111156117195761171961309c565b0361172d5761172784612639565b50505050565b6001816040015160018111156117455761174561309c565b036117275760008082602001518060200190518101906117659190614184565b90925090507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b282146117c3576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff1660028111156117e8576117e861309c565b03611822576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109a9565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b6118a06005826120d5565b6118d9576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109a9565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611920906137ab565b80601f016020809104026020016040519081016040528092919081815260200182805461194c906137ab565b80156119995780601f1061196e57610100808354040283529160200191611999565b820191906000526020600020905b81548152906001019060200180831161197c57829003601f168201915b505050505081526020016003820180546119b2906137ab565b80601f01602080910402602001604051908101604052809291908181526020018280546119de906137ab565b8015611a2b5780601f10611a0057610100808354040283529160200191611a2b565b820191906000526020600020905b815481529060010190602001808311611a0e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611aae5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611a59565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611b006002830182612fd1565b611b0e600383016000612fd1565b611b1c60048301600061300b565b50611b2a90506005836123a1565b50611b34816129af565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190611b8a906137ab565b9050600003611bd1576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109a9565b6040805160a08101825267ffffffffffffffff8716600090815260036020529182208054829190611c01906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2d906137ab565b8015611c7a5780601f10611c4f57610100808354040283529160200191611c7a565b820191906000526020600020905b815481529060010190602001808311611c5d57829003601f168201915b50505091835250506020808201879052604080830189905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8a166000908152600390925290206001018054608090920191611cdb906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611d07906137ab565b8015611d545780601f10611d2957610100808354040283529160200191611d54565b820191906000526020600020905b815481529060010190602001808311611d3757829003601f168201915b5050505050815250905060005b8551811015611eb157611dd13330888481518110611d8157611d816137fe565b602002602001015160200151898581518110611d9f57611d9f6137fe565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a21909392919063ffffffff16565b600754865173ffffffffffffffffffffffffffffffffffffffff90911690879083908110611e0157611e016137fe565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614611ea9576002548651611ea99173ffffffffffffffffffffffffffffffffffffffff1690889084908110611e5a57611e5a6137fe565b602002602001015160200151888481518110611e7857611e786137fe565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166123b99092919063ffffffff16565b600101611d61565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90611f0b908a9086906004016141a8565b602060405180830381865afa158015611f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4c9190614275565b90507f0000000000000000000000000000000000000000000000000000000000000000158015611f93575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15611fbd57600754611fbd9073ffffffffffffffffffffffffffffffffffffffff16333084612a21565b60025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615611fef576000611ff1565b825b89856040518463ffffffff1660e01b81526004016120109291906141a8565b60206040518083038185885af115801561202e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120539190614275565b60008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519195509085907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b2372908390a35050509392505050565b6120c96120f0565b6120d281612a7f565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109a9565b565b804710156121dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109a9565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612237576040519150601f19603f3d011682016040523d82523d6000602084013e61223c565b606091505b5050905080611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109a9565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113629084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b74565b60006120e98383612c80565b60006120e98383612d73565b80158061245957506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124579190614275565b155b6124e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109a9565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113629084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161231f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156125b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d69190614275565b6125e0919061428e565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506117279085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161231f565b60006040518060a00160405280838060400190612656919061386b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040516020918201916126ce917f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b29187359101918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561274857816020015b60408051808201909152600080825260208201528152602001906001900390816127215790505b50815260075473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604091820191600391600091612788919088019088016131a7565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546127b8906137ab565b80601f01602080910402602001604051908101604052809291908181526020018280546127e4906137ab565b80156128315780601f1061280657610100808354040283529160200191612831565b820191906000526020600020905b81548152906001019060200180831161281457829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded61286e60408601602087016131a7565b846040518363ffffffff1660e01b815260040161288c9291906141a8565b602060405180830381865afa1580156128a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cd9190614275565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612905576000612907565b835b61291760408801602089016131a7565b866040518463ffffffff1660e01b81526004016129359291906141a8565b60206040518083038185885af1158015612953573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129789190614275565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b6129b76120f0565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906129f3908490600401613320565b600060405180830381600087803b158015612a0d57600080fd5b505af1158015610fb0573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526117279085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161231f565b3373ffffffffffffffffffffffffffffffffffffffff821603612afe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109a9565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612bd6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612dc29092919063ffffffff16565b8051909150156113625780806020019051810190612bf491906142a1565b611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109a9565b60008181526001830160205260408120548015612d69576000612ca46001836142be565b8554909150600090612cb8906001906142be565b9050818114612d1d576000866000018281548110612cd857612cd86137fe565b9060005260206000200154905080876000018481548110612cfb57612cfb6137fe565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d2e57612d2e6142d1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610504565b6000915050610504565b6000818152600183016020526040812054612dba57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610504565b506000610504565b6060612dd18484600085612dd9565b949350505050565b606082471015612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109a9565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e9491906140c6565b60006040518083038185875af1925050503d8060008114612ed1576040519150601f19603f3d011682016040523d82523d6000602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f88578251600003612f815773ffffffffffffffffffffffffffffffffffffffff85163b612f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109a9565b5081612dd1565b612dd18383815115612f9d5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a99190613ea6565b508054612fdd906137ab565b6000825580601f10612fed575050565b601f0160209004906000526020600020908101906120d2919061302c565b50805460008255600202906000526020600020908101906120d29190613045565b5b80821115613041576000815560010161302d565b5090565b5b808211156130415780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613046565b60006020828403121561309557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613106577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff811681146120d257600080fd5b60008060006040848603121561313757600080fd5b83356131428161310c565b9250602084013567ffffffffffffffff8082111561315f57600080fd5b818601915086601f83011261317357600080fd5b81358181111561318257600080fd5b87602082850101111561319457600080fd5b6020830194508093505050509250925092565b6000602082840312156131b957600080fd5b81356120e98161310c565b60005b838110156131df5781810151838201526020016131c7565b50506000910152565b600081518084526132008160208601602086016131c4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061324560408301856131e8565b828103602084015261325781856131e8565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146120d257600080fd5b60008060006060848603121561329757600080fd5b83356132a281613260565b925060208401356132b281613260565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015613315578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016132d8565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261335a60c08401826131e8565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301608086015261339683836131e8565b925060808601519150808584030160a08601525061325782826132c3565b600080604083850312156133c757600080fd5b8235915060208301356133d981613260565b809150509250929050565b60008083601f8401126133f657600080fd5b50813567ffffffffffffffff81111561340e57600080fd5b6020830191508360208260051b850101111561342957600080fd5b9250929050565b6000806000806040858703121561344657600080fd5b843567ffffffffffffffff8082111561345e57600080fd5b61346a888389016133e4565b9096509450602087013591508082111561348357600080fd5b50613490878288016133e4565b95989497509550505050565b6000602082840312156134ae57600080fd5b813567ffffffffffffffff8111156134c557600080fd5b820160a081850312156120e957600080fd5b600080602083850312156134ea57600080fd5b823567ffffffffffffffff81111561350157600080fd5b61350d858286016133e4565b90969095509350505050565b60006020828403121561352b57600080fd5b81356120e981613260565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561358857613588613536565b60405290565b6040516060810167ffffffffffffffff8111828210171561358857613588613536565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135f8576135f8613536565b604052919050565b600082601f83011261361157600080fd5b813567ffffffffffffffff81111561362b5761362b613536565b61365c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016135b1565b81815284602083860101111561367157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156136a357600080fd5b83356136ae8161310c565b925060208481013567ffffffffffffffff808211156136cc57600080fd5b818701915087601f8301126136e057600080fd5b8135818111156136f2576136f2613536565b613700848260051b016135b1565b81815260069190911b8301840190848101908a83111561371f57600080fd5b938501935b8285101561376b576040858c03121561373d5760008081fd5b613745613565565b853561375081613260565b81528587013587820152825260409094019390850190613724565b96505050604087013592508083111561378357600080fd5b505061379186828701613600565b9150509250925092565b8183823760009101908152919050565b600181811c908216806137bf57607f821691505b6020821081036137f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261386157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138a057600080fd5b83018035915067ffffffffffffffff8211156138bb57600080fd5b60200191503681900382131561342957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261390557600080fd5b830160208101925035905067ffffffffffffffff81111561392557600080fd5b80360382131561342957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156133155781356139a081613260565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161398d565b6020815281356020820152600060208301356139ed8161310c565b67ffffffffffffffff8082166040850152613a0b60408601866138d0565b925060a06060860152613a2260c086018483613934565b925050613a3260608601866138d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a68858385613934565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613aa157600080fd5b60209288019283019235915083821115613aba57600080fd5b8160061b3603831315613acc57600080fd5b8685030160a0870152612ee784828461397d565b601f821115611362576000816000526020600020601f850160051c81016020861015613b095750805b601f850160051c820191505b81811015613b2857828155600101613b15565b505050505050565b67ffffffffffffffff831115613b4857613b48613536565b613b5c83613b5683546137ab565b83613ae0565b6000601f841160018114613bae5760008515613b785750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610fb0565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613bfd5786850135825560209485019460019092019101613bdd565b5086821015613c38577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c8481613260565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613cea57613cea613536565b805483825580841015613d775760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613d2b57613d2b613c4a565b8086168614613d3c57613d3c613c4a565b5060008360005260206000208360011b81018760011b820191505b80821015613d72578282558284830155600282019150613d57565b505050505b5060008181526020812083915b85811015613b2857613d968383613c79565b6040929092019160029190910190600101613d84565b81358155600181016020830135613dc28161310c565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613e02604086018661386b565b93509150613e14838360028701613b30565b613e21606086018661386b565b93509150613e33838360038701613b30565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e6a57600080fd5b918401918235915080821115613e7f57600080fd5b506020820191508060061b3603821315613e9857600080fd5b611727818360048601613cd1565b6020815260006120e960208301846131e8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261386157600080fd5b80151581146120d257600080fd5b600060808236031215613f0d57600080fd5b6040516080810167ffffffffffffffff8282108183111715613f3157613f31613536565b8160405284359150613f428261310c565b908252602084013590613f5482613eed565b8160208401526040850135915080821115613f6e57600080fd5b613f7a36838701613600565b60408401526060850135915080821115613f9357600080fd5b50613fa036828601613600565b60608301525092915050565b815167ffffffffffffffff811115613fc657613fc6613536565b613fda81613fd484546137ab565b84613ae0565b602080601f83116001811461402d5760008415613ff75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b28565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561407a5788860151825594840194600190910190840161405b565b50858210156140b657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516138618184602087016131c4565b6000602082840312156140ea57600080fd5b813567ffffffffffffffff8082111561410257600080fd5b908301906060828603121561411657600080fd5b61411e61358e565b82358281111561412d57600080fd5b61413987828601613600565b82525060208301358281111561414e57600080fd5b61415a87828601613600565b602083015250604083013592506002831061417457600080fd5b6040810192909252509392505050565b6000806040838503121561419757600080fd5b505080516020909101519092909150565b67ffffffffffffffff83168152604060208201526000825160a060408401526141d460e08401826131e8565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261421083836131e8565b9250604086015191508085840301608086015261422d83836132c3565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c08601525061426b82826131e8565b9695505050505050565b60006020828403121561428757600080fd5b5051919050565b8082018082111561050457610504613c4a565b6000602082840312156142b357600080fd5b81516120e981613eed565b8181038181111561050457610504613c4a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPClientWithACKABI = CCIPClientWithACKMetaData.ABI @@ -218,6 +218,28 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) ACKMESSAGEHEADER() ([3 return _CCIPClientWithACK.Contract.ACKMESSAGEHEADER(&_CCIPClientWithACK.CallOpts) } +func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPClientWithACK.contract.Call(opts, &out, "getFeeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPClientWithACK *CCIPClientWithACKSession) GetFeeToken() (common.Address, error) { + return _CCIPClientWithACK.Contract.GetFeeToken(&_CCIPClientWithACK.CallOpts) +} + +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetFeeToken() (common.Address, error) { + return _CCIPClientWithACK.Contract.GetFeeToken(&_CCIPClientWithACK.CallOpts) +} + func (_CCIPClientWithACK *CCIPClientWithACKCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} err := _CCIPClientWithACK.contract.Call(opts, &out, "getMessageContents", messageId) @@ -262,28 +284,6 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) GetRouter() (common.Ad return _CCIPClientWithACK.Contract.GetRouter(&_CCIPClientWithACK.CallOpts) } -func (_CCIPClientWithACK *CCIPClientWithACKCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _CCIPClientWithACK.contract.Call(opts, &out, "i_isPreFunded") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_CCIPClientWithACK *CCIPClientWithACKSession) IIsPreFunded() (bool, error) { - return _CCIPClientWithACK.Contract.IIsPreFunded(&_CCIPClientWithACK.CallOpts) -} - -func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) IIsPreFunded() (bool, error) { - return _CCIPClientWithACK.Contract.IIsPreFunded(&_CCIPClientWithACK.CallOpts) -} - func (_CCIPClientWithACK *CCIPClientWithACKCaller) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) { var out []interface{} err := _CCIPClientWithACK.contract.Call(opts, &out, "isApprovedSender", sourceChainSelector, senderAddr) @@ -380,48 +380,48 @@ func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SChainConfigs(destChai return _CCIPClientWithACK.Contract.SChainConfigs(&_CCIPClientWithACK.CallOpts, destChainSelector) } -func (_CCIPClientWithACK *CCIPClientWithACKCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_CCIPClientWithACK *CCIPClientWithACKCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { var out []interface{} - err := _CCIPClientWithACK.contract.Call(opts, &out, "s_feeToken") + err := _CCIPClientWithACK.contract.Call(opts, &out, "s_messageStatus", messageId) if err != nil { - return *new(common.Address), err + return *new(uint8), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) return out0, err } -func (_CCIPClientWithACK *CCIPClientWithACKSession) SFeeToken() (common.Address, error) { - return _CCIPClientWithACK.Contract.SFeeToken(&_CCIPClientWithACK.CallOpts) +func (_CCIPClientWithACK *CCIPClientWithACKSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) } -func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SFeeToken() (common.Address, error) { - return _CCIPClientWithACK.Contract.SFeeToken(&_CCIPClientWithACK.CallOpts) +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { + return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) } -func (_CCIPClientWithACK *CCIPClientWithACKCaller) SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) { +func (_CCIPClientWithACK *CCIPClientWithACKCaller) UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, error) { var out []interface{} - err := _CCIPClientWithACK.contract.Call(opts, &out, "s_messageStatus", messageId) + err := _CCIPClientWithACK.contract.Call(opts, &out, "usePreFundedFeeTokens") if err != nil { - return *new(uint8), err + return *new(bool), err } - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err } -func (_CCIPClientWithACK *CCIPClientWithACKSession) SMessageStatus(messageId [32]byte) (uint8, error) { - return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) +func (_CCIPClientWithACK *CCIPClientWithACKSession) UsePreFundedFeeTokens() (bool, error) { + return _CCIPClientWithACK.Contract.UsePreFundedFeeTokens(&_CCIPClientWithACK.CallOpts) } -func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) SMessageStatus(messageId [32]byte) (uint8, error) { - return _CCIPClientWithACK.Contract.SMessageStatus(&_CCIPClientWithACK.CallOpts, messageId) +func (_CCIPClientWithACK *CCIPClientWithACKCallerSession) UsePreFundedFeeTokens() (bool, error) { + return _CCIPClientWithACK.Contract.UsePreFundedFeeTokens(&_CCIPClientWithACK.CallOpts) } func (_CCIPClientWithACK *CCIPClientWithACKTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { @@ -2793,12 +2793,12 @@ func (_CCIPClientWithACK *CCIPClientWithACK) Address() common.Address { type CCIPClientWithACKInterface interface { ACKMESSAGEHEADER(opts *bind.CallOpts) ([32]byte, error) + GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) GetRouter(opts *bind.CallOpts) (common.Address, error) - IIsPreFunded(opts *bind.CallOpts) (bool, error) - IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -2809,10 +2809,10 @@ type CCIPClientWithACKInterface interface { error) - SFeeToken(opts *bind.CallOpts) (common.Address, error) - SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) + UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, 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 a5a4c0a1be..70c3f6e1b0 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go +++ b/core/gethwrappers/ccip/generated/ccipReceiver/ccipReceiver.go @@ -57,7 +57,7 @@ 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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\":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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b50604051620030a5380380620030a58339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612ea780620001fe6000396000f3fe6080604052600436106100f75760003560e01c806385572ffb1161008a578063c851cc3211610059578063c851cc32146102e1578063cf6730f814610301578063e4ca875414610321578063f2fde38b1461034157600080fd5b806385572ffb1461022a5780638da5cb5b1461024a5780639fe74e2614610296578063b0f479a1146102b657600080fd5b80636939cd97116100c65780636939cd97146101a85780636d62d633146101d557806379ba5097146101f55780638462a2b91461020a57600080fd5b80630a9094dc146101035780630e958d6b1461013857806335f170ef146101585780635e35359e1461018657600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004611fda565b610361565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610123610153366004612009565b610374565b34801561016457600080fd5b5061017861017336600461208e565b6103bf565b60405161012f929190612119565b34801561019257600080fd5b506101a66101a1366004612169565b6104eb565b005b3480156101b457600080fd5b506101c86101c3366004611fda565b6105c0565b60405161012f91906121aa565b3480156101e157600080fd5b506101a66101f0366004612291565b6107cb565b34801561020157600080fd5b506101a66109e2565b34801561021657600080fd5b506101a661022536600461230d565b610adf565b34801561023657600080fd5b506101a6610245366004612379565b610e20565b34801561025657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161012f565b3480156102a257600080fd5b506101a66102b13660046123b4565b611029565b3480156102c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610271565b3480156102ed57600080fd5b506101a66102fc3660046123f6565b6111dd565b34801561030d57600080fd5b506101a661031c366004612379565b6112a9565b34801561032d57600080fd5b506101a661033c366004611fda565b6113e5565b34801561034d57600080fd5b506101a661035c3660046123f6565b6116b3565b600061036e6005836116c7565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103a39085908590612413565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906103da90612423565b80601f016020809104026020016040519081016040528092919081815260200182805461040690612423565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b50505050509080600101805461046890612423565b80601f016020809104026020016040519081016040528092919081815260200182805461049490612423565b80156104e15780601f106104b6576101008083540402835291602001916104e1565b820191906000526020600020905b8154815290600101906020018083116104c457829003601f168201915b5050505050905082565b6104f36116e2565b73ffffffffffffffffffffffffffffffffffffffff83166105335761052e73ffffffffffffffffffffffffffffffffffffffff831682611765565b610554565b61055473ffffffffffffffffffffffffffffffffffffffff841683836118bf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105b391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161062f90612423565b80601f016020809104026020016040519081016040528092919081815260200182805461065b90612423565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016003820180546106c190612423565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612423565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610768565b505050915250909392505050565b6107d36116e2565b6107de6005836116c7565b61081c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561089d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610848565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506108ed6002830182611f28565b6108fb600383016000611f28565b610909600483016000611f62565b50610917905060058461194c565b5060005b8151811015610991576109898383838151811061093a5761093a612476565b60200260200101516020015184848151811061095857610958612476565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166118bf9092919063ffffffff16565b60010161091b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610813565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ae76116e2565b60005b81811015610c7a5760036000848484818110610b0857610b08612476565b9050602002810190610b1a91906124a5565b610b2890602081019061208e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610b5f57610b5f612476565b9050602002810190610b7191906124a5565b610b7f9060208101906124e3565b604051610b8d929190612413565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610bd457610bd4612476565b9050602002810190610be691906124a5565b610bf49060208101906124e3565b604051610c02929190612413565b6040518091039020838383818110610c1c57610c1c612476565b9050602002810190610c2e91906124a5565b610c3c90602081019061208e565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610aea565b5060005b83811015610e1957600160036000878785818110610c9e57610c9e612476565b9050602002810190610cb091906124a5565b610cbe90602081019061208e565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610cf557610cf5612476565b9050602002810190610d0791906124a5565b610d159060208101906124e3565b604051610d23929190612413565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610d7357610d73612476565b9050602002810190610d8591906124a5565b610d939060208101906124e3565b604051610da1929190612413565b6040518091039020858583818110610dbb57610dbb612476565b9050602002810190610dcd91906124a5565b610ddb90602081019061208e565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610c7e565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e73576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610813565b610e83604082016020830161208e565b67ffffffffffffffff8116600090815260036020526040902080548190610ea990612423565b9050600003610ef0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610813565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f2c908690600401612655565b600060405180830381600087803b158015610f4657600080fd5b505af1925050508015610f57575060015b610ff7573d808015610f85576040519150601f19603f3d011682016040523d82523d6000602084013e610f8a565b606091505b50610f9760058535611958565b50833560009081526004602052604090208490610fb48282612a5e565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610fe9908490612b5e565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6110316116e2565b60005b8181101561102457600083838381811061105057611050612476565b90506020028101906110629190612b71565b61106b90612c5e565b905080602001516110d657805167ffffffffffffffff16600090815260036020526040812061109991611f28565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26111d4565b806040015151600003611115576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906111409082612d0f565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061116e9082612d0f565b5080604001516040516111819190612e29565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516111cb9190612b5e565b60405180910390a35b50600101611034565b6111e56116e2565b73ffffffffffffffffffffffffffffffffffffffff8116611232576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146112e2576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112f2604082016020830161208e565b6112ff60408301836124e3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061135692509050612423565b159050806113ac5750600360008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201816040516113979190612e29565b9081526040519081900360200190205460ff16155b1561102457806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108139190612b5e565b6113f06005826116c7565b611429576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610813565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161147090612423565b80601f016020809104026020016040519081016040528092919081815260200182805461149c90612423565b80156114e95780601f106114be576101008083540402835291602001916114e9565b820191906000526020600020905b8154815290600101906020018083116114cc57829003601f168201915b5050505050815260200160038201805461150290612423565b80601f016020809104026020016040519081016040528092919081815260200182805461152e90612423565b801561157b5780601f106115505761010080835404028352916020019161157b565b820191906000526020600020905b81548152906001019060200180831161155e57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115fe5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016115a9565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506116506002830182611f28565b61165e600383016000611f28565b61166c600483016000611f62565b5061167a905060058361194c565b5061168481611964565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6116bb6116e2565b6116c4816119d6565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610813565b565b804710156117cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610813565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611829576040519150601f19603f3d011682016040523d82523d6000602084013e61182e565b606091505b5050905080611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610813565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611024908490611acb565b60006116db8383611bd7565b60006116db8383611cca565b61196c6116e2565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906119a89084906004016121aa565b600060405180830381600087803b1580156119c257600080fd5b505af1158015610e19573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610813565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b2d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d199092919063ffffffff16565b8051909150156110245780806020019051810190611b4b9190612e3b565b611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610813565b60008181526001830160205260408120548015611cc0576000611bfb600183612e58565b8554909150600090611c0f90600190612e58565b9050818114611c74576000866000018281548110611c2f57611c2f612476565b9060005260206000200154905080876000018481548110611c5257611c52612476565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c8557611c85612e6b565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061036e565b600091505061036e565b6000818152600183016020526040812054611d115750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561036e565b50600061036e565b6060611d288484600085611d30565b949350505050565b606082471015611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610813565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611deb9190612e29565b60006040518083038185875af1925050503d8060008114611e28576040519150601f19603f3d011682016040523d82523d6000602084013e611e2d565b606091505b5091509150611e3e87838387611e49565b979650505050505050565b60608315611edf578251600003611ed85773ffffffffffffffffffffffffffffffffffffffff85163b611ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610813565b5081611d28565b611d288383815115611ef45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139190612b5e565b508054611f3490612423565b6000825580601f10611f44575050565b601f0160209004906000526020600020908101906116c49190611f83565b50805460008255600202906000526020600020908101906116c49190611f9c565b5b80821115611f985760008155600101611f84565b5090565b5b80821115611f985780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201611f9d565b600060208284031215611fec57600080fd5b5035919050565b67ffffffffffffffff811681146116c457600080fd5b60008060006040848603121561201e57600080fd5b833561202981611ff3565b9250602084013567ffffffffffffffff8082111561204657600080fd5b818601915086601f83011261205a57600080fd5b81358181111561206957600080fd5b87602082850101111561207b57600080fd5b6020830194508093505050509250925092565b6000602082840312156120a057600080fd5b81356116db81611ff3565b60005b838110156120c65781810151838201526020016120ae565b50506000910152565b600081518084526120e78160208601602086016120ab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061212c60408301856120cf565b828103602084015261213e81856120cf565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146116c457600080fd5b60008060006060848603121561217e57600080fd5b833561218981612147565b9250602084013561219981612147565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a060608601526121e860c08601836120cf565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261222484836120cf565b608089015188820390920160a089015281518082529186019450600092508501905b80831015612285578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001929092019190830190612246565b50979650505050505050565b600080604083850312156122a457600080fd5b8235915060208301356122b681612147565b809150509250929050565b60008083601f8401126122d357600080fd5b50813567ffffffffffffffff8111156122eb57600080fd5b6020830191508360208260051b850101111561230657600080fd5b9250929050565b6000806000806040858703121561232357600080fd5b843567ffffffffffffffff8082111561233b57600080fd5b612347888389016122c1565b9096509450602087013591508082111561236057600080fd5b5061236d878288016122c1565b95989497509550505050565b60006020828403121561238b57600080fd5b813567ffffffffffffffff8111156123a257600080fd5b820160a081850312156116db57600080fd5b600080602083850312156123c757600080fd5b823567ffffffffffffffff8111156123de57600080fd5b6123ea858286016122c1565b90969095509350505050565b60006020828403121561240857600080fd5b81356116db81612147565b8183823760009101908152919050565b600181811c9082168061243757607f821691505b602082108103612470577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126124d957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261251857600080fd5b83018035915067ffffffffffffffff82111561253357600080fd5b60200191503681900382131561230657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261257d57600080fd5b830160208101925035905067ffffffffffffffff81111561259d57600080fd5b80360382131561230657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561264a57813561261881612147565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612605565b509495945050505050565b60208152813560208201526000602083013561267081611ff3565b67ffffffffffffffff808216604085015261268e6040860186612548565b925060a060608601526126a560c0860184836125ac565b9250506126b56060860186612548565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526126eb8583856125ac565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261272457600080fd5b6020928801928301923591508382111561273d57600080fd5b8160061b360383131561274f57600080fd5b8685030160a0870152611e3e8482846125f5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611024576000816000526020600020601f850160051c810160208610156127bb5750805b601f850160051c820191505b818110156127da578281556001016127c7565b505050505050565b67ffffffffffffffff8311156127fa576127fa612763565b61280e836128088354612423565b83612792565b6000601f841160018114612860576000851561282a5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e19565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156128af578685013582556020948501946001909201910161288f565b50868210156128ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561293681612147565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561299c5761299c612763565b805483825580841015612a295760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146129dd576129dd6128fc565b80861686146129ee576129ee6128fc565b5060008360005260206000208360011b81018760011b820191505b80821015612a24578282558284830155600282019150612a09565b505050505b5060008181526020812083915b858110156127da57612a48838361292b565b6040929092019160029190910190600101612a36565b81358155600181016020830135612a7481611ff3565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612ab460408601866124e3565b93509150612ac68383600287016127e2565b612ad360608601866124e3565b93509150612ae58383600387016127e2565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612b1c57600080fd5b918401918235915080821115612b3157600080fd5b506020820191508060061b3603821315612b4a57600080fd5b612b58818360048601612983565b50505050565b6020815260006116db60208301846120cf565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126124d957600080fd5b80151581146116c457600080fd5b600082601f830112612bc457600080fd5b813567ffffffffffffffff80821115612bdf57612bdf612763565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c2557612c25612763565b81604052838152866020858801011115612c3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808236031215612c7057600080fd5b6040516080810167ffffffffffffffff8282108183111715612c9457612c94612763565b8160405284359150612ca582611ff3565b908252602084013590612cb782612ba5565b8160208401526040850135915080821115612cd157600080fd5b612cdd36838701612bb3565b60408401526060850135915080821115612cf657600080fd5b50612d0336828601612bb3565b60608301525092915050565b815167ffffffffffffffff811115612d2957612d29612763565b612d3d81612d378454612423565b84612792565b602080601f831160018114612d905760008415612d5a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127da565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612ddd57888601518255948401946001909101908401612dbe565b5085821015612e1957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516124d98184602087016120ab565b600060208284031215612e4d57600080fd5b81516116db81612ba5565b8181038181111561036e5761036e6128fc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + Bin: "0x60806040523480156200001157600080fd5b5060405162003099380380620030998339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b612e9b80620001fe6000396000f3fe6080604052600436106100f75760003560e01c806385572ffb1161008a578063c851cc3211610059578063c851cc32146102e1578063cf6730f814610301578063e4ca875414610321578063f2fde38b1461034157600080fd5b806385572ffb1461022a5780638da5cb5b1461024a5780639fe74e2614610296578063b0f479a1146102b657600080fd5b80636939cd97116100c65780636939cd97146101a85780636d62d633146101d557806379ba5097146101f55780638462a2b91461020a57600080fd5b80630a9094dc146101035780630e958d6b1461013857806335f170ef146101585780635e35359e1461018657600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004611fce565b610361565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610123610153366004611ffd565b610374565b34801561016457600080fd5b50610178610173366004612082565b6103bf565b60405161012f92919061210d565b34801561019257600080fd5b506101a66101a136600461215d565b6104eb565b005b3480156101b457600080fd5b506101c86101c3366004611fce565b6105c0565b60405161012f919061219e565b3480156101e157600080fd5b506101a66101f0366004612285565b6107cb565b34801561020157600080fd5b506101a66109e3565b34801561021657600080fd5b506101a6610225366004612301565b610ae0565b34801561023657600080fd5b506101a661024536600461236d565b610e21565b34801561025657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161012f565b3480156102a257600080fd5b506101a66102b13660046123a8565b611018565b3480156102c257600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610271565b3480156102ed57600080fd5b506101a66102fc3660046123ea565b6111d1565b34801561030d57600080fd5b506101a661031c36600461236d565b61129d565b34801561032d57600080fd5b506101a661033c366004611fce565b6113d9565b34801561034d57600080fd5b506101a661035c3660046123ea565b6116a7565b600061036e6005836116bb565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906103a39085908590612407565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906103da90612417565b80601f016020809104026020016040519081016040528092919081815260200182805461040690612417565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b50505050509080600101805461046890612417565b80601f016020809104026020016040519081016040528092919081815260200182805461049490612417565b80156104e15780601f106104b6576101008083540402835291602001916104e1565b820191906000526020600020905b8154815290600101906020018083116104c457829003601f168201915b5050505050905082565b6104f36116d6565b73ffffffffffffffffffffffffffffffffffffffff83166105335761052e73ffffffffffffffffffffffffffffffffffffffff831682611759565b610554565b61055473ffffffffffffffffffffffffffffffffffffffff841683836118b3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516105b391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161062f90612417565b80601f016020809104026020016040519081016040528092919081815260200182805461065b90612417565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016003820180546106c190612417565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612417565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156107bd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610768565b505050915250909392505050565b6107d36116d6565b6107de6005836116bb565b61081c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b8282101561089d5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610848565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905592935090506108ed6002830182611f1c565b6108fb600383016000611f1c565b610909600483016000611f56565b506109179050600584611940565b5060005b8151811015610991576109898383838151811061093a5761093a61246a565b6020026020010151602001518484815181106109585761095861246a565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166118b39092919063ffffffff16565b60010161091b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610813565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ae86116d6565b60005b81811015610c7b5760036000848484818110610b0957610b0961246a565b9050602002810190610b1b9190612499565b610b29906020810190612082565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610b6057610b6061246a565b9050602002810190610b729190612499565b610b809060208101906124d7565b604051610b8e929190612407565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610bd557610bd561246a565b9050602002810190610be79190612499565b610bf59060208101906124d7565b604051610c03929190612407565b6040518091039020838383818110610c1d57610c1d61246a565b9050602002810190610c2f9190612499565b610c3d906020810190612082565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610aeb565b5060005b83811015610e1a57600160036000878785818110610c9f57610c9f61246a565b9050602002810190610cb19190612499565b610cbf906020810190612082565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610cf657610cf661246a565b9050602002810190610d089190612499565b610d169060208101906124d7565b604051610d24929190612407565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610d7457610d7461246a565b9050602002810190610d869190612499565b610d949060208101906124d7565b604051610da2929190612407565b6040518091039020858583818110610dbc57610dbc61246a565b9050602002810190610dce9190612499565b610ddc906020810190612082565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610c7f565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610e74576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610813565b610e846040820160208301612082565b67ffffffffffffffff811660009081526003602052604090208054610ea890612417565b9050600003610eef576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610813565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890610f2b908590600401612649565b600060405180830381600087803b158015610f4557600080fd5b505af1925050508015610f56575060015b610fe8573d808015610f84576040519150601f19603f3d011682016040523d82523d6000602084013e610f89565b606091505b50610f966005843561194c565b50823560009081526004602052604090208390610fb38282612a52565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906109d6908490612b52565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b6110206116d6565b60005b818110156111cc57600083838381811061103f5761103f61246a565b90506020028101906110519190612b65565b61105a90612c52565b905080602001516110c557805167ffffffffffffffff16600090815260036020526040812061108891611f1c565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26111c3565b806040015151600003611104576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061112f9082612d03565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061115d9082612d03565b5080604001516040516111709190612e1d565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516111ba9190612b52565b60405180910390a35b50600101611023565b505050565b6111d96116d6565b73ffffffffffffffffffffffffffffffffffffffff8116611226576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b3330146112d6576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112e66040820160208301612082565b6112f360408301836124d7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061134a92509050612417565b159050806113a05750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161138b9190612e1d565b9081526040519081900360200190205460ff16155b156111cc57806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016108139190612b52565b6113e46005826116bb565b61141d576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610813565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff1693810193909352600281018054919284019161146490612417565b80601f016020809104026020016040519081016040528092919081815260200182805461149090612417565b80156114dd5780601f106114b2576101008083540402835291602001916114dd565b820191906000526020600020905b8154815290600101906020018083116114c057829003601f168201915b505050505081526020016003820180546114f690612417565b80601f016020809104026020016040519081016040528092919081815260200182805461152290612417565b801561156f5780601f106115445761010080835404028352916020019161156f565b820191906000526020600020905b81548152906001019060200180831161155257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156115f25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff16825260019081015482840152908352909201910161159d565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506116446002830182611f1c565b611652600383016000611f1c565b611660600483016000611f56565b5061166e9050600583611940565b5061167881611958565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b6116af6116d6565b6116b8816119ca565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610813565b565b804710156117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610813565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461181d576040519150601f19603f3d011682016040523d82523d6000602084013e611822565b606091505b50509050806111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610813565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526111cc908490611abf565b60006116cf8383611bcb565b60006116cf8383611cbe565b6119606116d6565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061199c90849060040161219e565b600060405180830381600087803b1580156119b657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603611a49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610813565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b21826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d0d9092919063ffffffff16565b8051909150156111cc5780806020019051810190611b3f9190612e2f565b6111cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610813565b60008181526001830160205260408120548015611cb4576000611bef600183612e4c565b8554909150600090611c0390600190612e4c565b9050818114611c68576000866000018281548110611c2357611c2361246a565b9060005260206000200154905080876000018481548110611c4657611c4661246a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c7957611c79612e5f565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061036e565b600091505061036e565b6000818152600183016020526040812054611d055750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561036e565b50600061036e565b6060611d1c8484600085611d24565b949350505050565b606082471015611db6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610813565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611ddf9190612e1d565b60006040518083038185875af1925050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b5091509150611e3287838387611e3d565b979650505050505050565b60608315611ed3578251600003611ecc5773ffffffffffffffffffffffffffffffffffffffff85163b611ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610813565b5081611d1c565b611d1c8383815115611ee85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139190612b52565b508054611f2890612417565b6000825580601f10611f38575050565b601f0160209004906000526020600020908101906116b89190611f77565b50805460008255600202906000526020600020908101906116b89190611f90565b5b80821115611f8c5760008155600101611f78565b5090565b5b80821115611f8c5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201611f91565b600060208284031215611fe057600080fd5b5035919050565b67ffffffffffffffff811681146116b857600080fd5b60008060006040848603121561201257600080fd5b833561201d81611fe7565b9250602084013567ffffffffffffffff8082111561203a57600080fd5b818601915086601f83011261204e57600080fd5b81358181111561205d57600080fd5b87602082850101111561206f57600080fd5b6020830194508093505050509250925092565b60006020828403121561209457600080fd5b81356116cf81611fe7565b60005b838110156120ba5781810151838201526020016120a2565b50506000910152565b600081518084526120db81602086016020860161209f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60408152600061212060408301856120c3565b828103602084015261213281856120c3565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146116b857600080fd5b60008060006060848603121561217257600080fd5b833561217d8161213b565b9250602084013561218d8161213b565b929592945050506040919091013590565b6000602080835283518184015280840151604067ffffffffffffffff821660408601526040860151915060a060608601526121dc60c08601836120c3565b915060608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087850301608088015261221884836120c3565b608089015188820390920160a089015281518082529186019450600092508501905b80831015612279578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600192909201919083019061223a565b50979650505050505050565b6000806040838503121561229857600080fd5b8235915060208301356122aa8161213b565b809150509250929050565b60008083601f8401126122c757600080fd5b50813567ffffffffffffffff8111156122df57600080fd5b6020830191508360208260051b85010111156122fa57600080fd5b9250929050565b6000806000806040858703121561231757600080fd5b843567ffffffffffffffff8082111561232f57600080fd5b61233b888389016122b5565b9096509450602087013591508082111561235457600080fd5b50612361878288016122b5565b95989497509550505050565b60006020828403121561237f57600080fd5b813567ffffffffffffffff81111561239657600080fd5b820160a081850312156116cf57600080fd5b600080602083850312156123bb57600080fd5b823567ffffffffffffffff8111156123d257600080fd5b6123de858286016122b5565b90969095509350505050565b6000602082840312156123fc57600080fd5b81356116cf8161213b565b8183823760009101908152919050565b600181811c9082168061242b57607f821691505b602082108103612464577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126124cd57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261250c57600080fd5b83018035915067ffffffffffffffff82111561252757600080fd5b6020019150368190038213156122fa57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261257157600080fd5b830160208101925035905067ffffffffffffffff81111561259157600080fd5b8036038213156122fa57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561263e57813561260c8161213b565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016125f9565b509495945050505050565b60208152813560208201526000602083013561266481611fe7565b67ffffffffffffffff8082166040850152612682604086018661253c565b925060a0606086015261269960c0860184836125a0565b9250506126a9606086018661253c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526126df8583856125a0565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261271857600080fd5b6020928801928301923591508382111561273157600080fd5b8160061b360383131561274357600080fd5b8685030160a0870152611e328482846125e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f8211156111cc576000816000526020600020601f850160051c810160208610156127af5750805b601f850160051c820191505b818110156127ce578281556001016127bb565b505050505050565b67ffffffffffffffff8311156127ee576127ee612757565b612802836127fc8354612417565b83612786565b6000601f841160018114612854576000851561281e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610e1a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156128a35786850135825560209485019460019092019101612883565b50868210156128de577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561292a8161213b565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561299057612990612757565b805483825580841015612a1d5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146129d1576129d16128f0565b80861686146129e2576129e26128f0565b5060008360005260206000208360011b81018760011b820191505b80821015612a185782825582848301556002820191506129fd565b505050505b5060008181526020812083915b858110156127ce57612a3c838361291f565b6040929092019160029190910190600101612a2a565b81358155600181016020830135612a6881611fe7565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355612aa860408601866124d7565b93509150612aba8383600287016127d6565b612ac760608601866124d7565b93509150612ad98383600387016127d6565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312612b1057600080fd5b918401918235915080821115612b2557600080fd5b506020820191508060061b3603821315612b3e57600080fd5b612b4c818360048601612977565b50505050565b6020815260006116cf60208301846120c3565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126124cd57600080fd5b80151581146116b857600080fd5b600082601f830112612bb857600080fd5b813567ffffffffffffffff80821115612bd357612bd3612757565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612c1957612c19612757565b81604052838152866020858801011115612c3257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808236031215612c6457600080fd5b6040516080810167ffffffffffffffff8282108183111715612c8857612c88612757565b8160405284359150612c9982611fe7565b908252602084013590612cab82612b99565b8160208401526040850135915080821115612cc557600080fd5b612cd136838701612ba7565b60408401526060850135915080821115612cea57600080fd5b50612cf736828601612ba7565b60608301525092915050565b815167ffffffffffffffff811115612d1d57612d1d612757565b612d3181612d2b8454612417565b84612786565b602080601f831160018114612d845760008415612d4e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127ce565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612dd157888601518255948401946001909101908401612db2565b5085821015612e0d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516124cd81846020870161209f565b600060208284031215612e4157600080fd5b81516116cf81612b99565b8181038181111561036e5761036e6128f0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPReceiverABI = CCIPReceiverMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go index b0bb4c49f5..7596ff1607 100644 --- a/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go +++ b/core/gethwrappers/ccip/generated/ccipSender/ccipSender.go @@ -48,8 +48,8 @@ type ClientEVMTokenAmount struct { } var CCIPSenderMetaData = &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\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200255e3803806200255e8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61236080620001fe6000396000f3fe6080604052600436106100c05760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc321461021d578063effde2401461023d578063f2fde38b1461025e57600080fd5b80638da5cb5b146101865780639fe74e26146101d2578063b0f479a1146101f257600080fd5b80635e35359e116100a55780635e35359e1461012f57806379ba5097146101515780638462a2b91461016657600080fd5b80630e958d6b146100cc57806335f170ef1461010157600080fd5b366100c757005b600080fd5b3480156100d857600080fd5b506100ec6100e7366004611910565b61027e565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b5061012161011c366004611993565b6102c9565b6040516100f8929190611a23565b34801561013b57600080fd5b5061014f61014a366004611a75565b6103f5565b005b34801561015d57600080fd5b5061014f6104ca565b34801561017257600080fd5b5061014f610181366004611afd565b6105cc565b34801561019257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b3480156101de57600080fd5b5061014f6101ed366004611b69565b61090d565b3480156101fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101ad565b34801561022957600080fd5b5061014f610238366004611bab565b610ac6565b61025061024b366004611cfb565b610b92565b6040519081526020016100f8565b34801561026a57600080fd5b5061014f610279366004611bab565b61106e565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102ad9085908590611e15565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906102e490611e25565b80601f016020809104026020016040519081016040528092919081815260200182805461031090611e25565b801561035d5780601f106103325761010080835404028352916020019161035d565b820191906000526020600020905b81548152906001019060200180831161034057829003601f168201915b50505050509080600101805461037290611e25565b80601f016020809104026020016040519081016040528092919081815260200182805461039e90611e25565b80156103eb5780601f106103c0576101008083540402835291602001916103eb565b820191906000526020600020905b8154815290600101906020018083116103ce57829003601f168201915b5050505050905082565b6103fd611082565b73ffffffffffffffffffffffffffffffffffffffff831661043d5761043873ffffffffffffffffffffffffffffffffffffffff831682611105565b61045e565b61045e73ffffffffffffffffffffffffffffffffffffffff8416838361125f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516104bd91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105d4611082565b60005b8181101561076757600360008484848181106105f5576105f5611e78565b90506020028101906106079190611ea7565b610615906020810190611993565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061064c5761064c611e78565b905060200281019061065e9190611ea7565b61066c906020810190611ee5565b60405161067a929190611e15565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106106c1576106c1611e78565b90506020028101906106d39190611ea7565b6106e1906020810190611ee5565b6040516106ef929190611e15565b604051809103902083838381811061070957610709611e78565b905060200281019061071b9190611ea7565b610729906020810190611993565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016105d7565b5060005b838110156109065760016003600087878581811061078b5761078b611e78565b905060200281019061079d9190611ea7565b6107ab906020810190611993565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106107e2576107e2611e78565b90506020028101906107f49190611ea7565b610802906020810190611ee5565b604051610810929190611e15565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061086057610860611e78565b90506020028101906108729190611ea7565b610880906020810190611ee5565b60405161088e929190611e15565b60405180910390208585838181106108a8576108a8611e78565b90506020028101906108ba9190611ea7565b6108c8906020810190611993565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161076b565b5050505050565b610915611082565b60005b81811015610ac157600083838381811061093457610934611e78565b90506020028101906109469190611f4a565b61094f90611f8c565b905080602001516109ba57805167ffffffffffffffff16600090815260036020526040812061097d916118a5565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2610ab8565b8060400151516000036109f9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff16600090815260036020529190912090610a249082612089565b506060810151815167ffffffffffffffff16600090815260036020526040902060010190610a529082612089565b508060400151604051610a6591906121a3565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128360600151604051610aaf91906121b5565b60405180910390a35b50600101610918565b505050565b610ace611082565b73ffffffffffffffffffffffffffffffffffffffff8116610b1b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff8416600090815260036020526040812080548691908190610bbb90611e25565b9050600003610c02576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610547565b6040805160a08101825267ffffffffffffffff8916600090815260036020529182208054829190610c3290611e25565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e90611e25565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b505050505081526020018781526020018881526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600360008b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610d1290611e25565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3e90611e25565b8015610d8b5780601f10610d6057610100808354040283529160200191610d8b565b820191906000526020600020905b815481529060010190602001808311610d6e57829003601f168201915b5050505050815250905060005b8751811015610e9157610e0833308a8481518110610db857610db8611e78565b6020026020010151602001518b8581518110610dd657610dd6611e78565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611333909392919063ffffffff16565b6002548851610e899173ffffffffffffffffffffffffffffffffffffffff16908a9084908110610e3a57610e3a611e78565b6020026020010151602001518a8481518110610e5857610e58611e78565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166113979092919063ffffffff16565b600101610d98565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90610eeb908c9086906004016121c8565b602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906122dd565b905073ffffffffffffffffffffffffffffffffffffffff861615610f9357610f6c73ffffffffffffffffffffffffffffffffffffffff8716333084611333565b600254610f939073ffffffffffffffffffffffffffffffffffffffff888116911683611397565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f990881615610fc3576000610fc5565b825b8b856040518463ffffffff1660e01b8152600401610fe49291906121c8565b60206040518083038185885af1158015611002573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061102791906122dd565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161105a91815260200190565b60405180910390a150505050949350505050565b611076611082565b61107f81611495565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610547565b565b8047101561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610547565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146111c9576040519150601f19603f3d011682016040523d82523d6000602084013e6111ce565b606091505b5050905080610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610547565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ac19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261158a565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526113919085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112b1565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143291906122dd565b61143c91906122f6565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506113919085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016112b1565b3373ffffffffffffffffffffffffffffffffffffffff821603611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610547565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006115ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166116969092919063ffffffff16565b805190915015610ac1578080602001905181019061160a9190612336565b610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610547565b60606116a584846000856116ad565b949350505050565b60608247101561173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610547565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161176891906121a3565b60006040518083038185875af1925050503d80600081146117a5576040519150601f19603f3d011682016040523d82523d6000602084013e6117aa565b606091505b50915091506117bb878383876117c6565b979650505050505050565b6060831561185c5782516000036118555773ffffffffffffffffffffffffffffffffffffffff85163b611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610547565b50816116a5565b6116a583838151156118715781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054791906121b5565b5080546118b190611e25565b6000825580601f106118c1575050565b601f01602090049060005260206000209081019061107f91905b808211156118ef57600081556001016118db565b5090565b803567ffffffffffffffff8116811461190b57600080fd5b919050565b60008060006040848603121561192557600080fd5b61192e846118f3565b9250602084013567ffffffffffffffff8082111561194b57600080fd5b818601915086601f83011261195f57600080fd5b81358181111561196e57600080fd5b87602082850101111561198057600080fd5b6020830194508093505050509250925092565b6000602082840312156119a557600080fd5b6119ae826118f3565b9392505050565b60005b838110156119d05781810151838201526020016119b8565b50506000910152565b600081518084526119f18160208601602086016119b5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a3660408301856119d9565b8281036020840152611a4881856119d9565b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461190b57600080fd5b600080600060608486031215611a8a57600080fd5b611a9384611a51565b9250611aa160208501611a51565b9150604084013590509250925092565b60008083601f840112611ac357600080fd5b50813567ffffffffffffffff811115611adb57600080fd5b6020830191508360208260051b8501011115611af657600080fd5b9250929050565b60008060008060408587031215611b1357600080fd5b843567ffffffffffffffff80821115611b2b57600080fd5b611b3788838901611ab1565b90965094506020870135915080821115611b5057600080fd5b50611b5d87828801611ab1565b95989497509550505050565b60008060208385031215611b7c57600080fd5b823567ffffffffffffffff811115611b9357600080fd5b611b9f85828601611ab1565b90969095509350505050565b600060208284031215611bbd57600080fd5b6119ae82611a51565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c1857611c18611bc6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c6557611c65611bc6565b604052919050565b600082601f830112611c7e57600080fd5b813567ffffffffffffffff811115611c9857611c98611bc6565b611cc960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c1e565b818152846020838601011115611cde57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611d1157600080fd5b611d1a856118f3565b935060208086013567ffffffffffffffff80821115611d3857600080fd5b818801915088601f830112611d4c57600080fd5b813581811115611d5e57611d5e611bc6565b611d6c848260051b01611c1e565b81815260069190911b8301840190848101908b831115611d8b57600080fd5b938501935b82851015611dd5576040858d031215611da95760008081fd5b611db1611bf5565b611dba86611a51565b81528587013587820152825260409094019390850190611d90565b975050506040880135925080831115611ded57600080fd5b5050611dfb87828801611c6d565b925050611e0a60608601611a51565b905092959194509250565b8183823760009101908152919050565b600181811c90821680611e3957607f821691505b602082108103611e72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611edb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f1a57600080fd5b83018035915067ffffffffffffffff821115611f3557600080fd5b602001915036819003821315611af657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611edb57600080fd5b801515811461107f57600080fd5b600060808236031215611f9e57600080fd5b6040516080810167ffffffffffffffff8282108183111715611fc257611fc2611bc6565b81604052611fcf856118f3565b835260208501359150611fe182611f7e565b8160208401526040850135915080821115611ffb57600080fd5b61200736838701611c6d565b6040840152606085013591508082111561202057600080fd5b5061202d36828601611c6d565b60608301525092915050565b601f821115610ac1576000816000526020600020601f850160051c810160208610156120625750805b601f850160051c820191505b818110156120815782815560010161206e565b505050505050565b815167ffffffffffffffff8111156120a3576120a3611bc6565b6120b7816120b18454611e25565b84612039565b602080601f83116001811461210a57600084156120d45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612081565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561215757888601518255948401946001909101908401612138565b508582101561219357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611edb8184602087016119b5565b6020815260006119ae60208301846119d9565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526121f760e08601826119d9565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261223283836119d9565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612293578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612254565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506122cf81876119d9565b9a9950505050505050505050565b6000602082840312156122ef57600080fd5b5051919050565b80820180821115612330577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561234857600080fd5b81516119ae81611f7e56fea164736f6c6343000818000a", + 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\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200255b3803806200255b8339810160408190526200003491620001bc565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000111565b5050506001600160a01b038116620000ea576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b039290921691909117905550620001ee565b336001600160a01b038216036200016b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001cf57600080fd5b81516001600160a01b0381168114620001e757600080fd5b9392505050565b61235d80620001fe6000396000f3fe6080604052600436106100c05760003560e01c80638da5cb5b11610074578063c851cc321161004e578063c851cc321461021d578063effde2401461023d578063f2fde38b1461025e57600080fd5b80638da5cb5b146101865780639fe74e26146101d2578063b0f479a1146101f257600080fd5b80635e35359e116100a55780635e35359e1461012f57806379ba5097146101515780638462a2b91461016657600080fd5b80630e958d6b146100cc57806335f170ef1461010157600080fd5b366100c757005b600080fd5b3480156100d857600080fd5b506100ec6100e736600461190d565b61027e565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b5061012161011c366004611990565b6102c9565b6040516100f8929190611a20565b34801561013b57600080fd5b5061014f61014a366004611a72565b6103f5565b005b34801561015d57600080fd5b5061014f6104ca565b34801561017257600080fd5b5061014f610181366004611afa565b6105cc565b34801561019257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b3480156101de57600080fd5b5061014f6101ed366004611b66565b61090d565b3480156101fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101ad565b34801561022957600080fd5b5061014f610238366004611ba8565b610ac6565b61025061024b366004611cf8565b610b92565b6040519081526020016100f8565b34801561026a57600080fd5b5061014f610279366004611ba8565b61106b565b67ffffffffffffffff831660009081526003602052604080822090516002909101906102ad9085908590611e12565b9081526040519081900360200190205460ff1690509392505050565b6003602052600090815260409020805481906102e490611e22565b80601f016020809104026020016040519081016040528092919081815260200182805461031090611e22565b801561035d5780601f106103325761010080835404028352916020019161035d565b820191906000526020600020905b81548152906001019060200180831161034057829003601f168201915b50505050509080600101805461037290611e22565b80601f016020809104026020016040519081016040528092919081815260200182805461039e90611e22565b80156103eb5780601f106103c0576101008083540402835291602001916103eb565b820191906000526020600020905b8154815290600101906020018083116103ce57829003601f168201915b5050505050905082565b6103fd61107f565b73ffffffffffffffffffffffffffffffffffffffff831661043d5761043873ffffffffffffffffffffffffffffffffffffffff831682611102565b61045e565b61045e73ffffffffffffffffffffffffffffffffffffffff8416838361125c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516104bd91815260200190565b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105d461107f565b60005b8181101561076757600360008484848181106105f5576105f5611e75565b90506020028101906106079190611ea4565b610615906020810190611990565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061064c5761064c611e75565b905060200281019061065e9190611ea4565b61066c906020810190611ee2565b60405161067a929190611e12565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106106c1576106c1611e75565b90506020028101906106d39190611ea4565b6106e1906020810190611ee2565b6040516106ef929190611e12565b604051809103902083838381811061070957610709611e75565b905060200281019061071b9190611ea4565b610729906020810190611990565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016105d7565b5060005b838110156109065760016003600087878581811061078b5761078b611e75565b905060200281019061079d9190611ea4565b6107ab906020810190611990565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106107e2576107e2611e75565b90506020028101906107f49190611ea4565b610802906020810190611ee2565b604051610810929190611e12565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061086057610860611e75565b90506020028101906108729190611ea4565b610880906020810190611ee2565b60405161088e929190611e12565b60405180910390208585838181106108a8576108a8611e75565b90506020028101906108ba9190611ea4565b6108c8906020810190611990565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a360010161076b565b5050505050565b61091561107f565b60005b81811015610ac157600083838381811061093457610934611e75565b90506020028101906109469190611f47565b61094f90611f89565b905080602001516109ba57805167ffffffffffffffff16600090815260036020526040812061097d916118a2565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2610ab8565b8060400151516000036109f9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff16600090815260036020529190912090610a249082612086565b506060810151815167ffffffffffffffff16600090815260036020526040902060010190610a529082612086565b508060400151604051610a6591906121a0565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128360600151604051610aaf91906121b2565b60405180910390a35b50600101610918565b505050565b610ace61107f565b73ffffffffffffffffffffffffffffffffffffffff8116610b1b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b67ffffffffffffffff841660009081526003602052604081208054869190610bb990611e22565b9050600003610c00576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610547565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190610c3090611e22565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5c90611e22565b8015610ca95780601f10610c7e57610100808354040283529160200191610ca9565b820191906000526020600020905b815481529060010190602001808311610c8c57829003601f168201915b505050505081526020018681526020018781526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600360008a67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206001018054610d1090611e22565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3c90611e22565b8015610d895780601f10610d5e57610100808354040283529160200191610d89565b820191906000526020600020905b815481529060010190602001808311610d6c57829003601f168201915b5050505050815250905060005b8651811015610e8f57610e063330898481518110610db657610db6611e75565b6020026020010151602001518a8581518110610dd457610dd4611e75565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611330909392919063ffffffff16565b6002548751610e879173ffffffffffffffffffffffffffffffffffffffff1690899084908110610e3857610e38611e75565b602002602001015160200151898481518110610e5657610e56611e75565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166113949092919063ffffffff16565b600101610d96565b506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906320487ded90610ee9908b9086906004016121c5565b602060405180830381865afa158015610f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2a91906122da565b905073ffffffffffffffffffffffffffffffffffffffff851615610f9157610f6a73ffffffffffffffffffffffffffffffffffffffff8616333084611330565b600254610f919073ffffffffffffffffffffffffffffffffffffffff878116911683611394565b60025473ffffffffffffffffffffffffffffffffffffffff908116906396f4e9f990871615610fc1576000610fc3565b825b8a856040518463ffffffff1660e01b8152600401610fe29291906121c5565b60206040518083038185885af1158015611000573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061102591906122da565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8460405161105891815260200190565b60405180910390a1505050949350505050565b61107361107f565b61107c81611492565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611100576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610547565b565b8047101561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610547565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146111c6576040519150601f19603f3d011682016040523d82523d6000602084013e6111cb565b606091505b5050905080610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610547565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ac19084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611587565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261138e9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112ae565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f91906122da565b61143991906122f3565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061138e9085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016112ae565b3373ffffffffffffffffffffffffffffffffffffffff821603611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610547565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006115e9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166116939092919063ffffffff16565b805190915015610ac157808060200190518101906116079190612333565b610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610547565b60606116a284846000856116aa565b949350505050565b60608247101561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610547565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161176591906121a0565b60006040518083038185875af1925050503d80600081146117a2576040519150601f19603f3d011682016040523d82523d6000602084013e6117a7565b606091505b50915091506117b8878383876117c3565b979650505050505050565b606083156118595782516000036118525773ffffffffffffffffffffffffffffffffffffffff85163b611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610547565b50816116a2565b6116a2838381511561186e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054791906121b2565b5080546118ae90611e22565b6000825580601f106118be575050565b601f01602090049060005260206000209081019061107c91905b808211156118ec57600081556001016118d8565b5090565b803567ffffffffffffffff8116811461190857600080fd5b919050565b60008060006040848603121561192257600080fd5b61192b846118f0565b9250602084013567ffffffffffffffff8082111561194857600080fd5b818601915086601f83011261195c57600080fd5b81358181111561196b57600080fd5b87602082850101111561197d57600080fd5b6020830194508093505050509250925092565b6000602082840312156119a257600080fd5b6119ab826118f0565b9392505050565b60005b838110156119cd5781810151838201526020016119b5565b50506000910152565b600081518084526119ee8160208601602086016119b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611a3360408301856119d6565b8281036020840152611a4581856119d6565b95945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461190857600080fd5b600080600060608486031215611a8757600080fd5b611a9084611a4e565b9250611a9e60208501611a4e565b9150604084013590509250925092565b60008083601f840112611ac057600080fd5b50813567ffffffffffffffff811115611ad857600080fd5b6020830191508360208260051b8501011115611af357600080fd5b9250929050565b60008060008060408587031215611b1057600080fd5b843567ffffffffffffffff80821115611b2857600080fd5b611b3488838901611aae565b90965094506020870135915080821115611b4d57600080fd5b50611b5a87828801611aae565b95989497509550505050565b60008060208385031215611b7957600080fd5b823567ffffffffffffffff811115611b9057600080fd5b611b9c85828601611aae565b90969095509350505050565b600060208284031215611bba57600080fd5b6119ab82611a4e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c1557611c15611bc3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c6257611c62611bc3565b604052919050565b600082601f830112611c7b57600080fd5b813567ffffffffffffffff811115611c9557611c95611bc3565b611cc660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c1b565b818152846020838601011115611cdb57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611d0e57600080fd5b611d17856118f0565b935060208086013567ffffffffffffffff80821115611d3557600080fd5b818801915088601f830112611d4957600080fd5b813581811115611d5b57611d5b611bc3565b611d69848260051b01611c1b565b81815260069190911b8301840190848101908b831115611d8857600080fd5b938501935b82851015611dd2576040858d031215611da65760008081fd5b611dae611bf2565b611db786611a4e565b81528587013587820152825260409094019390850190611d8d565b975050506040880135925080831115611dea57600080fd5b5050611df887828801611c6a565b925050611e0760608601611a4e565b905092959194509250565b8183823760009101908152919050565b600181811c90821680611e3657607f821691505b602082108103611e6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112611ed857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f1757600080fd5b83018035915067ffffffffffffffff821115611f3257600080fd5b602001915036819003821315611af357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611ed857600080fd5b801515811461107c57600080fd5b600060808236031215611f9b57600080fd5b6040516080810167ffffffffffffffff8282108183111715611fbf57611fbf611bc3565b81604052611fcc856118f0565b835260208501359150611fde82611f7b565b8160208401526040850135915080821115611ff857600080fd5b61200436838701611c6a565b6040840152606085013591508082111561201d57600080fd5b5061202a36828601611c6a565b60608301525092915050565b601f821115610ac1576000816000526020600020601f850160051c8101602086101561205f5750805b601f850160051c820191505b8181101561207e5782815560010161206b565b505050505050565b815167ffffffffffffffff8111156120a0576120a0611bc3565b6120b4816120ae8454611e22565b84612036565b602080601f83116001811461210757600084156120d15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561207e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561215457888601518255948401946001909101908401612135565b508582101561219057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611ed88184602087016119b2565b6020815260006119ab60208301846119d6565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526121f460e08601826119d6565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261222f83836119d6565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612290578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612251565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506122cc81876119d6565b9a9950505050505050505050565b6000602082840312156122ec57600080fd5b5051919050565b8082018082111561232d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561234557600080fd5b81516119ab81611f7b56fea164736f6c6343000818000a", } var CCIPSenderABI = CCIPSenderMetaData.ABI @@ -1052,123 +1052,6 @@ func (_CCIPSender *CCIPSenderFilterer) ParseChainRemoved(log types.Log) (*CCIPSe return event, nil } -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 @@ -1712,8 +1595,6 @@ func (_CCIPSender *CCIPSender) ParseLog(log types.Log) (generated.AbigenLog, err return _CCIPSender.ParseChainAdded(log) case _CCIPSender.abi.Events["ChainRemoved"].ID: return _CCIPSender.ParseChainRemoved(log) - 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: @@ -1748,10 +1629,6 @@ func (CCIPSenderChainRemoved) Topic() common.Hash { return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") } -func (CCIPSenderMessageReceived) Topic() common.Hash { - return common.HexToHash("0xe29dc34207c78fc0f6048a32f159139c33339c6d6df8b07dcd33f6d699ff2327") -} - func (CCIPSenderMessageSent) Topic() common.Hash { return common.HexToHash("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") } @@ -1829,12 +1706,6 @@ type CCIPSenderInterface interface { ParseChainRemoved(log types.Log) (*CCIPSenderChainRemoved, 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) 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 9a22771d44..8eb91cd8ba 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b50604051620048c5380380620048c58339810160408190526200003491620005df565b8181600182803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000157565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492861692909116821790558215156080521590506200014c576002546007546200014c916001600160a01b03918216911660001962000202565b5050505050620006dc565b336001600160a01b03821603620001b15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002805750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000258573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027e91906200061e565b155b620002f45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200034c9185916200035116565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003a0906001600160a01b03851690849062000422565b8051909150156200034c5780806020019051810190620003c1919062000638565b6200034c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b60606200043384846000856200043b565b949350505050565b6060824710156200049e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004bc919062000689565b60006040518083038185875af1925050503d8060008114620004fb576040519150601f19603f3d011682016040523d82523d6000602084013e62000500565b606091505b50909250905062000514878383876200051f565b979650505050505050565b60608315620005935782516000036200058b576001600160a01b0385163b6200058b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b508162000433565b620004338383815115620005aa5781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006a7565b6001600160a01b0381168114620005dc57600080fd5b50565b60008060408385031215620005f357600080fd5b82516200060081620005c6565b60208401519092506200061381620005c6565b809150509250929050565b6000602082840312156200063157600080fd5b5051919050565b6000602082840312156200064b57600080fd5b815180151581146200065c57600080fd5b9392505050565b60005b838110156200068057818101518382015260200162000666565b50506000910152565b600082516200069d81846020870162000663565b9190910192915050565b6020815260008251806020840152620006c881604085016020870162000663565b601f01601f19169190910160400192915050565b6080516141c6620006ff60003960008181610320015261204301526141c66000f3fe6080604052600436106101b05760003560e01c806385572ffb116100ec578063c851cc321161008a578063e4ca875411610064578063e4ca875414610575578063e89b448514610595578063f2fde38b146105b6578063ff2deec3146105d657600080fd5b8063c851cc3214610515578063c89245d514610535578063cf6730f81461055557600080fd5b8063b0f479a1116100c6578063b0f479a11461044f578063b187bd261461047a578063b5a11011146104aa578063bee518a4146104ca57600080fd5b806385572ffb146103e45780638da5cb5b146104045780639fe74e261461042f57600080fd5b806335f170ef116101595780636939cd97116101335780636939cd97146103625780636d62d6331461038f57806379ba5097146103af5780638462a2b9146103c457600080fd5b806335f170ef146102e057806353d4f18a1461030e5780635e35359e1461034257600080fd5b8063181f5a771161018a578063181f5a77146102335780632874d8bf1461027f5780632b6e5d631461029457600080fd5b80630a9094dc146101bc5780630e958d6b146101f157806316c38b3c1461021157600080fd5b366101b757005b600080fd5b3480156101c857600080fd5b506101dc6101d7366004613054565b610603565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b506101dc61020c366004613083565b610616565b34801561021d57600080fd5b5061023161022c366004613116565b610661565b005b34801561023f57600080fd5b50604080518082018252601681527f50696e67506f6e6744656d6f20312e362e302d64657600000000000000000000602082015290516101e891906131a1565b34801561028b57600080fd5b506102316106b3565b3480156102a057600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e8565b3480156102ec57600080fd5b506103006102fb3660046131b4565b6106ef565b6040516101e89291906131d1565b34801561031a57600080fd5b506101dc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561034e57600080fd5b5061023161035d366004613221565b61081b565b34801561036e57600080fd5b5061038261037d366004613054565b6108f0565b6040516101e891906132bf565b34801561039b57600080fd5b506102316103aa366004613353565b610afb565b3480156103bb57600080fd5b50610231610d12565b3480156103d057600080fd5b506102316103df3660046133cf565b610e0f565b3480156103f057600080fd5b506102316103ff36600461343b565b611150565b34801561041057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561043b57600080fd5b5061023161044a366004613476565b611359565b34801561045b57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561048657600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101dc565b3480156104b657600080fd5b506102316104c53660046134b8565b61150d565b3480156104d657600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101e8565b34801561052157600080fd5b506102316105303660046134e6565b611715565b34801561054157600080fd5b506102316105503660046134e6565b6117e1565b34801561056157600080fd5b5061023161057036600461343b565b61194b565b34801561058157600080fd5b50610231610590366004613054565b611ad6565b6105a86105a3366004613638565b611da4565b6040519081526020016101e8565b3480156105c257600080fd5b506102316105d13660046134e6565b6122e0565b3480156105e257600080fd5b506007546102bb9073ffffffffffffffffffffffffffffffffffffffff1681565b60006106106005836122f4565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106459085908590613745565b9081526040519081900360200190205460ff1690509392505050565b61066961230f565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106bb61230f565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556106ed6001612390565b565b60036020526000908152604090208054819061070a90613755565b80601f016020809104026020016040519081016040528092919081815260200182805461073690613755565b80156107835780601f1061075857610100808354040283529160200191610783565b820191906000526020600020905b81548152906001019060200180831161076657829003601f168201915b50505050509080600101805461079890613755565b80601f01602080910402602001604051908101604052809291908181526020018280546107c490613755565b80156108115780601f106107e657610100808354040283529160200191610811565b820191906000526020600020905b8154815290600101906020018083116107f457829003601f168201915b5050505050905082565b61082361230f565b73ffffffffffffffffffffffffffffffffffffffff83166108635761085e73ffffffffffffffffffffffffffffffffffffffff8316826124b4565b610884565b61088473ffffffffffffffffffffffffffffffffffffffff8416838361260e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516108e391815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161095f90613755565b80601f016020809104026020016040519081016040528092919081815260200182805461098b90613755565b80156109d85780601f106109ad576101008083540402835291602001916109d8565b820191906000526020600020905b8154815290600101906020018083116109bb57829003601f168201915b505050505081526020016003820180546109f190613755565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90613755565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610aed5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a98565b505050915250909392505050565b610b0361230f565b610b0e6005836122f4565b610b4c576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610bcd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b78565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c1d6002830182612fa2565b610c2b600383016000612fa2565b610c39600483016000612fdc565b50610c4790506005846126e2565b5060005b8151811015610cc157610cb983838381518110610c6a57610c6a6137a8565b602002602001015160200151848481518110610c8857610c886137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1661260e9092919063ffffffff16565b600101610c4b565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b43565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e1761230f565b60005b81811015610faa5760036000848484818110610e3857610e386137a8565b9050602002810190610e4a91906137d7565b610e589060208101906131b4565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e8f57610e8f6137a8565b9050602002810190610ea191906137d7565b610eaf906020810190613815565b604051610ebd929190613745565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f0457610f046137a8565b9050602002810190610f1691906137d7565b610f24906020810190613815565b604051610f32929190613745565b6040518091039020838383818110610f4c57610f4c6137a8565b9050602002810190610f5e91906137d7565b610f6c9060208101906131b4565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e1a565b5060005b8381101561114957600160036000878785818110610fce57610fce6137a8565b9050602002810190610fe091906137d7565b610fee9060208101906131b4565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110611025576110256137a8565b905060200281019061103791906137d7565b611045906020810190613815565b604051611053929190613745565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106110a3576110a36137a8565b90506020028101906110b591906137d7565b6110c3906020810190613815565b6040516110d1929190613745565b60405180910390208585838181106110eb576110eb6137a8565b90506020028101906110fd91906137d7565b61110b9060208101906131b4565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610fae565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146111a3576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b43565b6111b360408201602083016131b4565b67ffffffffffffffff81166000908152600360205260409020805481906111d990613755565b9050600003611220576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b43565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061125c90869060040161397c565b600060405180830381600087803b15801561127657600080fd5b505af1925050508015611287575060015b611327573d8080156112b5576040519150601f19603f3d011682016040523d82523d6000602084013e6112ba565b606091505b506112c7600585356126ee565b508335600090815260046020526040902084906112e48282613d56565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113199084906131a1565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b61136161230f565b60005b81811015611354576000838383818110611380576113806137a8565b90506020028101906113929190613e50565b61139b90613e84565b9050806020015161140657805167ffffffffffffffff1660009081526003602052604081206113c991612fa2565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611504565b806040015151600003611445576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906114709082613f35565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061149e9082613f35565b5080604001516040516114b1919061404f565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516114fb91906131a1565b60405180910390a35b50600101611364565b61151561230f565b73ffffffffffffffffffffffffffffffffffffffff81161580611540575067ffffffffffffffff8216155b15611577576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526116689161404f565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113549082613f35565b61171d61230f565b73ffffffffffffffffffffffffffffffffffffffff811661176a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6117e961230f565b60075473ffffffffffffffffffffffffffffffffffffffff161561184a5761184a61182960025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006126fa565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156118f7576118f76118b760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61287c565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611984576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199460408201602083016131b4565b6119a16040830183613815565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506119f892509050613755565b15905080611a4e5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611a39919061404f565b9081526040519081900360200190205460ff16155b15611a8757806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b4391906131a1565b60085474010000000000000000000000000000000000000000900460ff1661135457611354611ab96060850185613815565b810190611ac69190613054565b611ad1906001614061565b612390565b611ae16005826122f4565b611b1a576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b43565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b6190613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8d90613755565b8015611bda5780601f10611baf57610100808354040283529160200191611bda565b820191906000526020600020905b815481529060010190602001808311611bbd57829003601f168201915b50505050508152602001600382018054611bf390613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1f90613755565b8015611c6c5780601f10611c4157610100808354040283529160200191611c6c565b820191906000526020600020905b815481529060010190602001808311611c4f57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611cef5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c9a565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611d416002830182612fa2565b611d4f600383016000612fa2565b611d5d600483016000612fdc565b50611d6b90506005836126e2565b50611d7581612980565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591908190611dcd90613755565b9050600003611e14576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610b43565b6040805160a08101825267ffffffffffffffff8816600090815260036020529182208054829190611e4490613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090613755565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b166000908152600390925290206001018054608090920191611f1e90613755565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90613755565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611ffe908b908690600401614074565b602060405180830381865afa15801561201b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203f9190614141565b90507f0000000000000000000000000000000000000000000000000000000000000000158015612086575060075473ffffffffffffffffffffffffffffffffffffffff1615155b156120b0576007546120b09073ffffffffffffffffffffffffffffffffffffffff163330846129f2565b60005b87518110156122035761212333308a84815181106120d3576120d36137a8565b6020026020010151602001518b85815181106120f1576120f16137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129f2909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff90911690899083908110612153576121536137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121fb5760025488516121fb9173ffffffffffffffffffffffffffffffffffffffff16908a90849081106121ac576121ac6137a8565b6020026020010151602001518a84815181106121ca576121ca6137a8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126fa9092919063ffffffff16565b6001016120b3565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612236576000612238565b825b8a856040518463ffffffff1660e01b8152600401612257929190614074565b60206040518083038185885af1158015612275573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061229a9190614141565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a856040516122cd91815260200190565b60405180910390a1505050509392505050565b6122e861230f565b6122f181612a50565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b43565b806001166001036123d3576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612407565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161241c91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600754600080855260208501909352909350611354927401000000000000000000000000000000000000000090910467ffffffffffffffff16916124ad565b60408051808201909152600080825260208201528152602001906001900390816124865790505b5083611da4565b8047101561251e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b43565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612578576040519150601f19603f3d011682016040523d82523d6000602084013e61257d565b606091505b5050905080611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b43565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113549084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b45565b60006123088383612c51565b60006123088383612d44565b80158061279a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127989190614141565b155b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b43565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113549084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612660565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156128f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129179190614141565b6129219190614061565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061297a9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612660565b50505050565b61298861230f565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906129c49084906004016132bf565b600060405180830381600087803b1580156129de57600080fd5b505af1158015611149573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261297a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612660565b3373ffffffffffffffffffffffffffffffffffffffff821603612acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b43565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612ba7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d939092919063ffffffff16565b8051909150156113545780806020019051810190612bc5919061415a565b611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b43565b60008181526001830160205260408120548015612d3a576000612c75600183614177565b8554909150600090612c8990600190614177565b9050818114612cee576000866000018281548110612ca957612ca96137a8565b9060005260206000200154905080876000018481548110612ccc57612ccc6137a8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cff57612cff61418a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610610565b6000915050610610565b6000818152600183016020526040812054612d8b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610610565b506000610610565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b43565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e65919061404f565b60006040518083038185875af1925050503d8060008114612ea2576040519150601f19603f3d011682016040523d82523d6000602084013e612ea7565b606091505b5091509150612eb887838387612ec3565b979650505050505050565b60608315612f59578251600003612f525773ffffffffffffffffffffffffffffffffffffffff85163b612f52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b43565b5081612da2565b612da28383815115612f6e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4391906131a1565b508054612fae90613755565b6000825580601f10612fbe575050565b601f0160209004906000526020600020908101906122f19190612ffd565b50805460008255600202906000526020600020908101906122f19190613016565b5b808211156130125760008155600101612ffe565b5090565b5b808211156130125780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613017565b60006020828403121561306657600080fd5b5035919050565b67ffffffffffffffff811681146122f157600080fd5b60008060006040848603121561309857600080fd5b83356130a38161306d565b9250602084013567ffffffffffffffff808211156130c057600080fd5b818601915086601f8301126130d457600080fd5b8135818111156130e357600080fd5b8760208285010111156130f557600080fd5b6020830194508093505050509250925092565b80151581146122f157600080fd5b60006020828403121561312857600080fd5b813561230881613108565b60005b8381101561314e578181015183820152602001613136565b50506000910152565b6000815180845261316f816020860160208601613133565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006123086020830184613157565b6000602082840312156131c657600080fd5b81356123088161306d565b6040815260006131e46040830185613157565b82810360208401526131f68185613157565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122f157600080fd5b60008060006060848603121561323657600080fd5b8335613241816131ff565b92506020840135613251816131ff565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156132b4578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613277565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526132f960c0840182613157565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133358383613157565b925060808601519150808584030160a0860152506131f68282613262565b6000806040838503121561336657600080fd5b823591506020830135613378816131ff565b809150509250929050565b60008083601f84011261339557600080fd5b50813567ffffffffffffffff8111156133ad57600080fd5b6020830191508360208260051b85010111156133c857600080fd5b9250929050565b600080600080604085870312156133e557600080fd5b843567ffffffffffffffff808211156133fd57600080fd5b61340988838901613383565b9096509450602087013591508082111561342257600080fd5b5061342f87828801613383565b95989497509550505050565b60006020828403121561344d57600080fd5b813567ffffffffffffffff81111561346457600080fd5b820160a0818503121561230857600080fd5b6000806020838503121561348957600080fd5b823567ffffffffffffffff8111156134a057600080fd5b6134ac85828601613383565b90969095509350505050565b600080604083850312156134cb57600080fd5b82356134d68161306d565b91506020830135613378816131ff565b6000602082840312156134f857600080fd5b8135612308816131ff565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561355557613555613503565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135a2576135a2613503565b604052919050565b600082601f8301126135bb57600080fd5b813567ffffffffffffffff8111156135d5576135d5613503565b61360660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161355b565b81815284602083860101111561361b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561364d57600080fd5b83356136588161306d565b925060208481013567ffffffffffffffff8082111561367657600080fd5b818701915087601f83011261368a57600080fd5b81358181111561369c5761369c613503565b6136aa848260051b0161355b565b81815260069190911b8301840190848101908a8311156136c957600080fd5b938501935b82851015613715576040858c0312156136e75760008081fd5b6136ef613532565b85356136fa816131ff565b815285870135878201528252604090940193908501906136ce565b96505050604087013592508083111561372d57600080fd5b505061373b868287016135aa565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061376957607f821691505b6020821081036137a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261380b57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261384a57600080fd5b83018035915067ffffffffffffffff82111561386557600080fd5b6020019150368190038213156133c857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126138af57600080fd5b830160208101925035905067ffffffffffffffff8111156138cf57600080fd5b8036038213156133c857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156132b457813561394a816131ff565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613937565b6020815281356020820152600060208301356139978161306d565b67ffffffffffffffff80821660408501526139b5604086018661387a565b925060a060608601526139cc60c0860184836138de565b9250506139dc606086018661387a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a128583856138de565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613a4b57600080fd5b60209288019283019235915083821115613a6457600080fd5b8160061b3603831315613a7657600080fd5b8685030160a0870152612eb8848284613927565b601f821115611354576000816000526020600020601f850160051c81016020861015613ab35750805b601f850160051c820191505b81811015613ad257828155600101613abf565b505050505050565b67ffffffffffffffff831115613af257613af2613503565b613b0683613b008354613755565b83613a8a565b6000601f841160018114613b585760008515613b225750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611149565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613ba75786850135825560209485019460019092019101613b87565b5086821015613be2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c2e816131ff565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c9457613c94613503565b805483825580841015613d215760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613cd557613cd5613bf4565b8086168614613ce657613ce6613bf4565b5060008360005260206000208360011b81018760011b820191505b80821015613d1c578282558284830155600282019150613d01565b505050505b5060008181526020812083915b85811015613ad257613d408383613c23565b6040929092019160029190910190600101613d2e565b81358155600181016020830135613d6c8161306d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613dac6040860186613815565b93509150613dbe838360028701613ada565b613dcb6060860186613815565b93509150613ddd838360038701613ada565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e1457600080fd5b918401918235915080821115613e2957600080fd5b506020820191508060061b3603821315613e4257600080fd5b61297a818360048601613c7b565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261380b57600080fd5b600060808236031215613e9657600080fd5b6040516080810167ffffffffffffffff8282108183111715613eba57613eba613503565b8160405284359150613ecb8261306d565b908252602084013590613edd82613108565b8160208401526040850135915080821115613ef757600080fd5b613f03368387016135aa565b60408401526060850135915080821115613f1c57600080fd5b50613f29368286016135aa565b60608301525092915050565b815167ffffffffffffffff811115613f4f57613f4f613503565b613f6381613f5d8454613755565b84613a8a565b602080601f831160018114613fb65760008415613f805750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ad2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561400357888601518255948401946001909101908401613fe4565b508582101561403f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161380b818460208701613133565b8082018082111561061057610610613bf4565b67ffffffffffffffff83168152604060208201526000825160a060408401526140a060e0840182613157565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526140dc8383613157565b925060408601519150808584030160808601526140f98383613262565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506141378282613157565b9695505050505050565b60006020828403121561415357600080fd5b5051919050565b60006020828403121561416c57600080fd5b815161230881613108565b8181038181111561061057610610613bf4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usePreFundedFeeTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPreFunded\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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: "0x60a06040523480156200001157600080fd5b50604051620048b0380380620048b08339810160408190526200003491620005dc565b8181600182803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000154565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600780549286169290911682179055821515608052159050620001495760025462000149906001600160a01b038481169116600019620001ff565b5050505050620006d9565b336001600160a01b03821603620001ae5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200027d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027b91906200061b565b155b620002f15760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003499185916200034e16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200039d906001600160a01b0385169084906200041f565b805190915015620003495780806020019051810190620003be919062000635565b620003495760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b606062000430848460008562000438565b949350505050565b6060824710156200049b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004b9919062000686565b60006040518083038185875af1925050503d8060008114620004f8576040519150601f19603f3d011682016040523d82523d6000602084013e620004fd565b606091505b50909250905062000511878383876200051c565b979650505050505050565b606083156200059057825160000362000588576001600160a01b0385163b620005885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b508162000430565b620004308383815115620005a75781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006a4565b6001600160a01b0381168114620005d957600080fd5b50565b60008060408385031215620005f057600080fd5b8251620005fd81620005c3565b60208401519092506200061081620005c3565b809150509250929050565b6000602082840312156200062e57600080fd5b5051919050565b6000602082840312156200064857600080fd5b815180151581146200065957600080fd5b9392505050565b60005b838110156200067d57818101518382015260200162000663565b50506000910152565b600082516200069a81846020870162000660565b9190910192915050565b6020815260008251806020840152620006c581604085016020870162000660565b601f01601f19169190910160400192915050565b6080516141b4620006fc6000396000818161038a015261203201526141b46000f3fe6080604052600436106101b05760003560e01c806385572ffb116100ec578063c851cc321161008a578063cf6730f811610064578063cf6730f81461057f578063e4ca87541461059f578063e89b4485146105bf578063f2fde38b146105e057600080fd5b8063c851cc3214610514578063c89245d514610534578063ca709a251461055457600080fd5b8063b0f479a1116100c6578063b0f479a11461044e578063b187bd2614610479578063b5a11011146104a9578063bee518a4146104c957600080fd5b806385572ffb146103e35780638da5cb5b146104035780639fe74e261461042e57600080fd5b806335f170ef116101595780636d62d633116101335780636d62d6331461035b57806372be9eb81461037b57806379ba5097146103ae5780638462a2b9146103c357600080fd5b806335f170ef146102e05780635e35359e1461030e5780636939cd971461032e57600080fd5b8063181f5a771161018a578063181f5a77146102335780632874d8bf1461027f5780632b6e5d631461029457600080fd5b80630a9094dc146101bc5780630e958d6b146101f157806316c38b3c1461021157600080fd5b366101b757005b600080fd5b3480156101c857600080fd5b506101dc6101d7366004613042565b610600565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b506101dc61020c366004613071565b610613565b34801561021d57600080fd5b5061023161022c366004613104565b61065e565b005b34801561023f57600080fd5b50604080518082018252601681527f50696e67506f6e6744656d6f20312e362e302d64657600000000000000000000602082015290516101e8919061318f565b34801561028b57600080fd5b506102316106b0565b3480156102a057600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e8565b3480156102ec57600080fd5b506103006102fb3660046131a2565b6106ec565b6040516101e89291906131bf565b34801561031a57600080fd5b5061023161032936600461320f565b610818565b34801561033a57600080fd5b5061034e610349366004613042565b6108ed565b6040516101e891906132ad565b34801561036757600080fd5b50610231610376366004613341565b610af8565b34801561038757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006101dc565b3480156103ba57600080fd5b50610231610d10565b3480156103cf57600080fd5b506102316103de3660046133bd565b610e0d565b3480156103ef57600080fd5b506102316103fe366004613429565b61114e565b34801561040f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561043a57600080fd5b50610231610449366004613464565b611345565b34801561045a57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561048557600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101dc565b3480156104b557600080fd5b506102316104c43660046134a6565b6114fe565b3480156104d557600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101e8565b34801561052057600080fd5b5061023161052f3660046134d4565b611706565b34801561054057600080fd5b5061023161054f3660046134d4565b6117d2565b34801561056057600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff166102bb565b34801561058b57600080fd5b5061023161059a366004613429565b61193c565b3480156105ab57600080fd5b506102316105ba366004613042565b611ac7565b6105d26105cd366004613626565b611d95565b6040519081526020016101e8565b3480156105ec57600080fd5b506102316105fb3660046134d4565b6122ce565b600061060d6005836122e2565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106429085908590613733565b9081526040519081900360200190205460ff1690509392505050565b6106666122fd565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6106b86122fd565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556106ea600161237e565b565b60036020526000908152604090208054819061070790613743565b80601f016020809104026020016040519081016040528092919081815260200182805461073390613743565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b50505050509080600101805461079590613743565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190613743565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905082565b6108206122fd565b73ffffffffffffffffffffffffffffffffffffffff83166108605761085b73ffffffffffffffffffffffffffffffffffffffff8316826124a2565b610881565b61088173ffffffffffffffffffffffffffffffffffffffff841683836125fc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516108e091815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161095c90613743565b80601f016020809104026020016040519081016040528092919081815260200182805461098890613743565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b505050505081526020016003820180546109ee90613743565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1a90613743565b8015610a675780601f10610a3c57610100808354040283529160200191610a67565b820191906000526020600020905b815481529060010190602001808311610a4a57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610aea5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610a95565b505050915250909392505050565b610b006122fd565b610b0b6005836122e2565b610b49576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610bca5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b75565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610c1a6002830182612f90565b610c28600383016000612f90565b610c36600483016000612fca565b50610c4490506005846126d0565b5060005b8151811015610cbe57610cb683838381518110610c6757610c67613796565b602002602001015160200151848481518110610c8557610c85613796565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166125fc9092919063ffffffff16565b600101610c48565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b40565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e156122fd565b60005b81811015610fa85760036000848484818110610e3657610e36613796565b9050602002810190610e4891906137c5565b610e569060208101906131a2565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e8d57610e8d613796565b9050602002810190610e9f91906137c5565b610ead906020810190613803565b604051610ebb929190613733565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610f0257610f02613796565b9050602002810190610f1491906137c5565b610f22906020810190613803565b604051610f30929190613733565b6040518091039020838383818110610f4a57610f4a613796565b9050602002810190610f5c91906137c5565b610f6a9060208101906131a2565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610e18565b5060005b8381101561114757600160036000878785818110610fcc57610fcc613796565b9050602002810190610fde91906137c5565b610fec9060208101906131a2565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061102357611023613796565b905060200281019061103591906137c5565b611043906020810190613803565b604051611051929190613733565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790558484828181106110a1576110a1613796565b90506020028101906110b391906137c5565b6110c1906020810190613803565b6040516110cf929190613733565b60405180910390208585838181106110e9576110e9613796565b90506020028101906110fb91906137c5565b6111099060208101906131a2565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610fac565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146111a1576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610b40565b6111b160408201602083016131a2565b67ffffffffffffffff8116600090815260036020526040902080546111d590613743565b905060000361121c576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b40565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f89061125890859060040161396a565b600060405180830381600087803b15801561127257600080fd5b505af1925050508015611283575060015b611315573d8080156112b1576040519150601f19603f3d011682016040523d82523d6000602084013e6112b6565b606091505b506112c3600584356126dc565b508235600090815260046020526040902083906112e08282613d44565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610d0390849061318f565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b61134d6122fd565b60005b818110156114f957600083838381811061136c5761136c613796565b905060200281019061137e9190613e3e565b61138790613e72565b905080602001516113f257805167ffffffffffffffff1660009081526003602052604081206113b591612f90565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26114f0565b806040015151600003611431576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff1660009081526003602052919091209061145c9082613f23565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061148a9082613f23565b50806040015160405161149d919061403d565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516114e7919061318f565b60405180910390a35b50600101611350565b505050565b6115066122fd565b73ffffffffffffffffffffffffffffffffffffffff81161580611531575067ffffffffffffffff8216155b15611568576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526116599161403d565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906114f99082613f23565b61170e6122fd565b73ffffffffffffffffffffffffffffffffffffffff811661175b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6117da6122fd565b60075473ffffffffffffffffffffffffffffffffffffffff161561183b5761183b61181a60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006126e8565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156118e8576118e86118a860025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61286a565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611975576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198560408201602083016131a2565b6119926040830183613803565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506119e992509050613743565b15905080611a3f5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611a2a919061403d565b9081526040519081900360200190205460ff16155b15611a7857806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610b40919061318f565b60085474010000000000000000000000000000000000000000900460ff166114f9576114f9611aaa6060850185613803565b810190611ab79190613042565b611ac290600161404f565b61237e565b611ad26005826122e2565b611b0b576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610b40565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611b5290613743565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7e90613743565b8015611bcb5780601f10611ba057610100808354040283529160200191611bcb565b820191906000526020600020905b815481529060010190602001808311611bae57829003601f168201915b50505050508152602001600382018054611be490613743565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1090613743565b8015611c5d5780601f10611c3257610100808354040283529160200191611c5d565b820191906000526020600020905b815481529060010190602001808311611c4057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611ce05760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611c8b565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611d326002830182612f90565b611d40600383016000612f90565b611d4e600483016000612fca565b50611d5c90506005836126d0565b50611d668161296e565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190611dbc90613743565b9050600003611e03576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610b40565b6040805160a08101825267ffffffffffffffff8716600090815260036020529182208054829190611e3390613743565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5f90613743565b8015611eac5780601f10611e8157610100808354040283529160200191611eac565b820191906000526020600020905b815481529060010190602001808311611e8f57829003601f168201915b50505091835250506020808201879052604080830189905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8a166000908152600390925290206001018054608090920191611f0d90613743565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3990613743565b8015611f865780601f10611f5b57610100808354040283529160200191611f86565b820191906000526020600020905b815481529060010190602001808311611f6957829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90611fed908a908690600401614062565b602060405180830381865afa15801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e919061412f565b90507f0000000000000000000000000000000000000000000000000000000000000000158015612075575060075473ffffffffffffffffffffffffffffffffffffffff1615155b1561209f5760075461209f9073ffffffffffffffffffffffffffffffffffffffff163330846129e0565b60005b86518110156121f25761211233308984815181106120c2576120c2613796565b6020026020010151602001518a85815181106120e0576120e0613796565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129e0909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061214257612142613796565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146121ea5760025487516121ea9173ffffffffffffffffffffffffffffffffffffffff169089908490811061219b5761219b613796565b6020026020010151602001518984815181106121b9576121b9613796565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166126e89092919063ffffffff16565b6001016120a2565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612225576000612227565b825b89856040518463ffffffff1660e01b8152600401612246929190614062565b60206040518083038185885af1158015612264573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612289919061412f565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a846040516122bc91815260200190565b60405180910390a15050509392505050565b6122d66122fd565b6122df81612a3e565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b40565b806001166001036123c1576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16123f5565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161240a91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181526007546000808552602085019093529093506114f9927401000000000000000000000000000000000000000090910467ffffffffffffffff169161249b565b60408051808201909152600080825260208201528152602001906001900390816124745790505b5083611d95565b8047101561250c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b40565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612566576040519150601f19603f3d011682016040523d82523d6000602084013e61256b565b606091505b50509050806114f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b40565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526114f99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b33565b60006122f68383612c3f565b60006122f68383612d32565b80158061278857506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612762573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612786919061412f565b155b612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b40565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526114f99084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161264e565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156128e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612905919061412f565b61290f919061404f565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506129689085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161264e565b50505050565b6129766122fd565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906129b29084906004016132ad565b600060405180830381600087803b1580156129cc57600080fd5b505af1158015611147573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129689085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161264e565b3373ffffffffffffffffffffffffffffffffffffffff821603612abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b40565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612b95826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d819092919063ffffffff16565b8051909150156114f95780806020019051810190612bb39190614148565b6114f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b40565b60008181526001830160205260408120548015612d28576000612c63600183614165565b8554909150600090612c7790600190614165565b9050818114612cdc576000866000018281548110612c9757612c97613796565b9060005260206000200154905080876000018481548110612cba57612cba613796565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ced57612ced614178565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061060d565b600091505061060d565b6000818152600183016020526040812054612d795750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561060d565b50600061060d565b6060612d908484600085612d98565b949350505050565b606082471015612e2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b40565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e53919061403d565b60006040518083038185875af1925050503d8060008114612e90576040519150601f19603f3d011682016040523d82523d6000602084013e612e95565b606091505b5091509150612ea687838387612eb1565b979650505050505050565b60608315612f47578251600003612f405773ffffffffffffffffffffffffffffffffffffffff85163b612f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b40565b5081612d90565b612d908383815115612f5c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b40919061318f565b508054612f9c90613743565b6000825580601f10612fac575050565b601f0160209004906000526020600020908101906122df9190612feb565b50805460008255600202906000526020600020908101906122df9190613004565b5b808211156130005760008155600101612fec565b5090565b5b808211156130005780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613005565b60006020828403121561305457600080fd5b5035919050565b67ffffffffffffffff811681146122df57600080fd5b60008060006040848603121561308657600080fd5b83356130918161305b565b9250602084013567ffffffffffffffff808211156130ae57600080fd5b818601915086601f8301126130c257600080fd5b8135818111156130d157600080fd5b8760208285010111156130e357600080fd5b6020830194508093505050509250925092565b80151581146122df57600080fd5b60006020828403121561311657600080fd5b81356122f6816130f6565b60005b8381101561313c578181015183820152602001613124565b50506000910152565b6000815180845261315d816020860160208601613121565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006122f66020830184613145565b6000602082840312156131b457600080fd5b81356122f68161305b565b6040815260006131d26040830185613145565b82810360208401526131e48185613145565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146122df57600080fd5b60008060006060848603121561322457600080fd5b833561322f816131ed565b9250602084013561323f816131ed565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156132a2578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613265565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526132e760c0840182613145565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526133238383613145565b925060808601519150808584030160a0860152506131e48282613250565b6000806040838503121561335457600080fd5b823591506020830135613366816131ed565b809150509250929050565b60008083601f84011261338357600080fd5b50813567ffffffffffffffff81111561339b57600080fd5b6020830191508360208260051b85010111156133b657600080fd5b9250929050565b600080600080604085870312156133d357600080fd5b843567ffffffffffffffff808211156133eb57600080fd5b6133f788838901613371565b9096509450602087013591508082111561341057600080fd5b5061341d87828801613371565b95989497509550505050565b60006020828403121561343b57600080fd5b813567ffffffffffffffff81111561345257600080fd5b820160a081850312156122f657600080fd5b6000806020838503121561347757600080fd5b823567ffffffffffffffff81111561348e57600080fd5b61349a85828601613371565b90969095509350505050565b600080604083850312156134b957600080fd5b82356134c48161305b565b91506020830135613366816131ed565b6000602082840312156134e657600080fd5b81356122f6816131ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613543576135436134f1565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613590576135906134f1565b604052919050565b600082601f8301126135a957600080fd5b813567ffffffffffffffff8111156135c3576135c36134f1565b6135f460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613549565b81815284602083860101111561360957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561363b57600080fd5b83356136468161305b565b925060208481013567ffffffffffffffff8082111561366457600080fd5b818701915087601f83011261367857600080fd5b81358181111561368a5761368a6134f1565b613698848260051b01613549565b81815260069190911b8301840190848101908a8311156136b757600080fd5b938501935b82851015613703576040858c0312156136d55760008081fd5b6136dd613520565b85356136e8816131ed565b815285870135878201528252604090940193908501906136bc565b96505050604087013592508083111561371b57600080fd5b505061372986828701613598565b9150509250925092565b8183823760009101908152919050565b600181811c9082168061375757607f821691505b602082108103613790577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126137f957600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261383857600080fd5b83018035915067ffffffffffffffff82111561385357600080fd5b6020019150368190038213156133b657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261389d57600080fd5b830160208101925035905067ffffffffffffffff8111156138bd57600080fd5b8036038213156133b657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156132a2578135613938816131ed565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613925565b6020815281356020820152600060208301356139858161305b565b67ffffffffffffffff80821660408501526139a36040860186613868565b925060a060608601526139ba60c0860184836138cc565b9250506139ca6060860186613868565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613a008583856138cc565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613a3957600080fd5b60209288019283019235915083821115613a5257600080fd5b8160061b3603831315613a6457600080fd5b8685030160a0870152612ea6848284613915565b601f8211156114f9576000816000526020600020601f850160051c81016020861015613aa15750805b601f850160051c820191505b81811015613ac057828155600101613aad565b505050505050565b67ffffffffffffffff831115613ae057613ae06134f1565b613af483613aee8354613743565b83613a78565b6000601f841160018114613b465760008515613b105750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611147565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613b955786850135825560209485019460019092019101613b75565b5086821015613bd0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135613c1c816131ed565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b68010000000000000000831115613c8257613c826134f1565b805483825580841015613d0f5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168314613cc357613cc3613be2565b8086168614613cd457613cd4613be2565b5060008360005260206000208360011b81018760011b820191505b80821015613d0a578282558284830155600282019150613cef565b505050505b5060008181526020812083915b85811015613ac057613d2e8383613c11565b6040929092019160029190910190600101613d1c565b81358155600181016020830135613d5a8161305b565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000845416178355613d9a6040860186613803565b93509150613dac838360028701613ac8565b613db96060860186613803565b93509150613dcb838360038701613ac8565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018312613e0257600080fd5b918401918235915080821115613e1757600080fd5b506020820191508060061b3603821315613e3057600080fd5b612968818360048601613c69565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126137f957600080fd5b600060808236031215613e8457600080fd5b6040516080810167ffffffffffffffff8282108183111715613ea857613ea86134f1565b8160405284359150613eb98261305b565b908252602084013590613ecb826130f6565b8160208401526040850135915080821115613ee557600080fd5b613ef136838701613598565b60408401526060850135915080821115613f0a57600080fd5b50613f1736828601613598565b60608301525092915050565b815167ffffffffffffffff811115613f3d57613f3d6134f1565b613f5181613f4b8454613743565b84613a78565b602080601f831160018114613fa45760008415613f6e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ac0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613ff157888601518255948401946001909101908401613fd2565b508582101561402d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600082516137f9818460208701613121565b8082018082111561060d5761060d613be2565b67ffffffffffffffff83168152604060208201526000825160a0604084015261408e60e0840182613145565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526140ca8383613145565b925060408601519150808584030160808601526140e78383613250565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506141258282613145565b9695505050505050565b60006020828403121561414157600080fd5b5051919050565b60006020828403121561415a57600080fd5b81516122f6816130f6565b8181038181111561060d5761060d613be2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -240,6 +240,28 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetCounterpartChainSelector() (u return _PingPongDemo.Contract.GetCounterpartChainSelector(&_PingPongDemo.CallOpts) } +func (_PingPongDemo *PingPongDemoCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getFeeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetFeeToken() (common.Address, error) { + return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetFeeToken() (common.Address, error) { + return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) +} + func (_PingPongDemo *PingPongDemoCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "getMessageContents", messageId) @@ -284,28 +306,6 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetRouter() (common.Address, err return _PingPongDemo.Contract.GetRouter(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "i_isPreFunded") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_PingPongDemo *PingPongDemoSession) IIsPreFunded() (bool, error) { - return _PingPongDemo.Contract.IIsPreFunded(&_PingPongDemo.CallOpts) -} - -func (_PingPongDemo *PingPongDemoCallerSession) IIsPreFunded() (bool, error) { - return _PingPongDemo.Contract.IIsPreFunded(&_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) @@ -424,48 +424,48 @@ func (_PingPongDemo *PingPongDemoCallerSession) SChainConfigs(destChainSelector return _PingPongDemo.Contract.SChainConfigs(&_PingPongDemo.CallOpts, destChainSelector) } -func (_PingPongDemo *PingPongDemoCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_PingPongDemo *PingPongDemoCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "s_feeToken") + err := _PingPongDemo.contract.Call(opts, &out, "typeAndVersion") if err != nil { - return *new(common.Address), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -func (_PingPongDemo *PingPongDemoSession) SFeeToken() (common.Address, error) { - return _PingPongDemo.Contract.SFeeToken(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoSession) TypeAndVersion() (string, error) { + return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCallerSession) SFeeToken() (common.Address, error) { - return _PingPongDemo.Contract.SFeeToken(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoCallerSession) TypeAndVersion() (string, error) { + return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { +func (_PingPongDemo *PingPongDemoCaller) UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, error) { var out []interface{} - err := _PingPongDemo.contract.Call(opts, &out, "typeAndVersion") + err := _PingPongDemo.contract.Call(opts, &out, "usePreFundedFeeTokens") if err != nil { - return *new(string), err + return *new(bool), err } - out0 := *abi.ConvertType(out[0], new(string)).(*string) + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err } -func (_PingPongDemo *PingPongDemoSession) TypeAndVersion() (string, error) { - return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoSession) UsePreFundedFeeTokens() (bool, error) { + return _PingPongDemo.Contract.UsePreFundedFeeTokens(&_PingPongDemo.CallOpts) } -func (_PingPongDemo *PingPongDemoCallerSession) TypeAndVersion() (string, error) { - return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) +func (_PingPongDemo *PingPongDemoCallerSession) UsePreFundedFeeTokens() (bool, error) { + return _PingPongDemo.Contract.UsePreFundedFeeTokens(&_PingPongDemo.CallOpts) } func (_PingPongDemo *PingPongDemoTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { @@ -2838,12 +2838,12 @@ type PingPongDemoInterface interface { GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) + GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) GetRouter(opts *bind.CallOpts) (common.Address, error) - IIsPreFunded(opts *bind.CallOpts) (bool, error) - IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -2856,10 +2856,10 @@ type PingPongDemoInterface interface { error) - SFeeToken(opts *bind.CallOpts) (common.Address, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) + UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, 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 2bf9c9835c..05320ec769 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 @@ -56,8 +56,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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_isPreFunded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60a06040523480156200001157600080fd5b5060405162004ddc38038062004ddc83398101604081905262000034916200060d565b82828181600182803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000185565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492861692909116821790558215156080521590506200014e576002546007546200014e916001600160a01b03918216911660001962000230565b505050505080600262000162919062000666565b600860156101000a81548160ff021916908360ff16021790555050505062000756565b336001600160a01b03821603620001df5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002ae5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000286573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ac919062000698565b155b620003225760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200037a9185916200037f16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003ce906001600160a01b03851690849062000450565b8051909150156200037a5780806020019051810190620003ef9190620006b2565b6200037a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b606062000461848460008562000469565b949350505050565b606082471015620004cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004ea919062000703565b60006040518083038185875af1925050503d806000811462000529576040519150601f19603f3d011682016040523d82523d6000602084013e6200052e565b606091505b50909250905062000542878383876200054d565b979650505050505050565b60608315620005c1578251600003620005b9576001600160a01b0385163b620005b95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b508162000461565b620004618383815115620005d85781518083602001fd5b8060405162461bcd60e51b81526004016200008a919062000721565b6001600160a01b03811681146200060a57600080fd5b50565b6000806000606084860312156200062357600080fd5b83516200063081620005f4565b60208501519093506200064381620005f4565b604085015190925060ff811681146200065b57600080fd5b809150509250925092565b60ff81811683821602908116908181146200069157634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215620006ab57600080fd5b5051919050565b600060208284031215620006c557600080fd5b81518015158114620006d657600080fd5b9392505050565b60005b83811015620006fa578181015183820152602001620006e0565b50506000910152565b6000825162000717818460208701620006dd565b9190910192915050565b602081526000825180602084015262000742816040850160208701620006dd565b601f01601f19169190910160400192915050565b608051614663620007796000396000818161034b01526122c701526146636000f3fe6080604052600436106101d15760003560e01c80638f491cba116100f7578063c89245d511610095578063e89b448511610064578063e89b44851461061e578063ef686d8e1461063f578063f2fde38b1461065f578063ff2deec31461067f57600080fd5b8063c89245d514610580578063cf6730f8146105a0578063e4ca8754146105c0578063e6c725f5146105e057600080fd5b8063b187bd26116100d1578063b187bd26146104c5578063b5a11011146104f5578063bee518a414610515578063c851cc321461056057600080fd5b80638f491cba1461045a5780639fe74e261461047a578063b0f479a11461049a57600080fd5b806353d4f18a1161016f57806379ba50971161013e57806379ba5097146103da5780638462a2b9146103ef57806385572ffb1461040f5780638da5cb5b1461042f57600080fd5b806353d4f18a146103395780635e35359e1461036d5780636939cd971461038d5780636d62d633146103ba57600080fd5b8063181f5a77116101ab578063181f5a77146102545780632874d8bf146102aa5780632b6e5d63146102bf57806335f170ef1461030b57600080fd5b80630a9094dc146101dd5780630e958d6b1461021257806316c38b3c1461023257600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004613476565b6106ac565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506101fd61022d3660046134a5565b6106bf565b34801561023e57600080fd5b5061025261024d366004613538565b61070a565b005b34801561026057600080fd5b5061029d6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b60405161020991906135c3565b3480156102b657600080fd5b5061025261075c565b3480156102cb57600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b34801561031757600080fd5b5061032b6103263660046135d6565b610798565b6040516102099291906135f3565b34801561034557600080fd5b506101fd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561037957600080fd5b50610252610388366004613643565b6108c4565b34801561039957600080fd5b506103ad6103a8366004613476565b610999565b60405161020991906136e1565b3480156103c657600080fd5b506102526103d5366004613775565b610ba4565b3480156103e657600080fd5b50610252610dbb565b3480156103fb57600080fd5b5061025261040a3660046137f1565b610eb8565b34801561041b57600080fd5b5061025261042a36600461385d565b6111f9565b34801561043b57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102e6565b34801561046657600080fd5b50610252610475366004613476565b611402565b34801561048657600080fd5b50610252610495366004613898565b6115dd565b3480156104a657600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102e6565b3480156104d157600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101fd565b34801561050157600080fd5b506102526105103660046138da565b611791565b34801561052157600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610209565b34801561056c57600080fd5b5061025261057b366004613908565b611999565b34801561058c57600080fd5b5061025261059b366004613908565b611a65565b3480156105ac57600080fd5b506102526105bb36600461385d565b611bcf565b3480156105cc57600080fd5b506102526105db366004613476565b611d5a565b3480156105ec57600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610209565b61063161062c366004613a5a565b612028565b604051908152602001610209565b34801561064b57600080fd5b5061025261065a366004613b67565b612564565b34801561066b57600080fd5b5061025261067a366004613908565b6125ed565b34801561068b57600080fd5b506007546102e69073ffffffffffffffffffffffffffffffffffffffff1681565b60006106b96005836125fe565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106ee9085908590613b8a565b9081526040519081900360200190205460ff1690509392505050565b610712612619565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610764612619565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055610796600161269a565b565b6003602052600090815260409020805481906107b390613b9a565b80601f01602080910402602001604051908101604052809291908181526020018280546107df90613b9a565b801561082c5780601f106108015761010080835404028352916020019161082c565b820191906000526020600020905b81548152906001019060200180831161080f57829003601f168201915b50505050509080600101805461084190613b9a565b80601f016020809104026020016040519081016040528092919081815260200182805461086d90613b9a565b80156108ba5780601f1061088f576101008083540402835291602001916108ba565b820191906000526020600020905b81548152906001019060200180831161089d57829003601f168201915b5050505050905082565b6108cc612619565b73ffffffffffffffffffffffffffffffffffffffff831661090c5761090773ffffffffffffffffffffffffffffffffffffffff8316826128d6565b61092d565b61092d73ffffffffffffffffffffffffffffffffffffffff84168383612a30565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161098c91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a0890613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3490613b9a565b8015610a815780601f10610a5657610100808354040283529160200191610a81565b820191906000526020600020905b815481529060010190602001808311610a6457829003601f168201915b50505050508152602001600382018054610a9a90613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac690613b9a565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b965760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b41565b505050915250909392505050565b610bac612619565b610bb76005836125fe565b610bf5576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610c765760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c21565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610cc660028301826133c4565b610cd46003830160006133c4565b610ce26004830160006133fe565b50610cf09050600584612b04565b5060005b8151811015610d6a57610d6283838381518110610d1357610d13613bed565b602002602001015160200151848481518110610d3157610d31613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a309092919063ffffffff16565b600101610cf4565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610bec565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ec0612619565b60005b818110156110535760036000848484818110610ee157610ee1613bed565b9050602002810190610ef39190613c1c565b610f019060208101906135d6565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f3857610f38613bed565b9050602002810190610f4a9190613c1c565b610f58906020810190613c5a565b604051610f66929190613b8a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610fad57610fad613bed565b9050602002810190610fbf9190613c1c565b610fcd906020810190613c5a565b604051610fdb929190613b8a565b6040518091039020838383818110610ff557610ff5613bed565b90506020028101906110079190613c1c565b6110159060208101906135d6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ec3565b5060005b838110156111f25760016003600087878581811061107757611077613bed565b90506020028101906110899190613c1c565b6110979060208101906135d6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110ce576110ce613bed565b90506020028101906110e09190613c1c565b6110ee906020810190613c5a565b6040516110fc929190613b8a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061114c5761114c613bed565b905060200281019061115e9190613c1c565b61116c906020810190613c5a565b60405161117a929190613b8a565b604051809103902085858381811061119457611194613bed565b90506020028101906111a69190613c1c565b6111b49060208101906135d6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611057565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461124c576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610bec565b61125c60408201602083016135d6565b67ffffffffffffffff811660009081526003602052604090208054819061128290613b9a565b90506000036112c9576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bec565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611305908690600401613dc1565b600060405180830381600087803b15801561131f57600080fd5b505af1925050508015611330575060015b6113d0573d80801561135e576040519150601f19603f3d011682016040523d82523d6000602084013e611363565b606091505b5061137060058535612b10565b5083356000908152600460205260409020849061138d828261419b565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906113c29084906135c3565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6008547501000000000000000000000000000000000000000000900460ff16158061144a57506008547501000000000000000000000000000000000000000000900460ff1681105b156114525750565b60085460019061147e907501000000000000000000000000000000000000000000900460ff1683614295565b116115da5760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561152d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155191906142d0565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6115e5612619565b60005b818110156113fd57600083838381811061160457611604613bed565b905060200281019061161691906142ed565b61161f90614321565b9050806020015161168a57805167ffffffffffffffff16600090815260036020526040812061164d916133c4565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611788565b8060400151516000036116c9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906116f490826143d2565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061172290826143d2565b50806040015160405161173591906144ec565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212836060015160405161177f91906135c3565b60405180910390a35b506001016115e8565b611799612619565b73ffffffffffffffffffffffffffffffffffffffff811615806117c4575067ffffffffffffffff8216155b156117fb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526118ec916144ec565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906113fd90826143d2565b6119a1612619565b73ffffffffffffffffffffffffffffffffffffffff81166119ee576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611a6d612619565b60075473ffffffffffffffffffffffffffffffffffffffff1615611ace57611ace611aad60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612b1c565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611b7b57611b7b611b3b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c9e565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611c08576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c1860408201602083016135d6565b611c256040830183613c5a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611c7c92509050613b9a565b15905080611cd25750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611cbd91906144ec565b9081526040519081900360200190205460ff16155b15611d0b57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610bec91906135c3565b60085474010000000000000000000000000000000000000000900460ff166113fd576113fd611d3d6060850185613c5a565b810190611d4a9190613476565b611d559060016144fe565b61269a565b611d656005826125fe565b611d9e576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610bec565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611de590613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1190613b9a565b8015611e5e5780601f10611e3357610100808354040283529160200191611e5e565b820191906000526020600020905b815481529060010190602001808311611e4157829003601f168201915b50505050508152602001600382018054611e7790613b9a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea390613b9a565b8015611ef05780601f10611ec557610100808354040283529160200191611ef0565b820191906000526020600020905b815481529060010190602001808311611ed357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611f735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f1e565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611fc560028301826133c4565b611fd36003830160006133c4565b611fe16004830160006133fe565b50611fef9050600583612b04565b50611ff981612da2565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff831660009081526003602052604081208054859190819061205190613b9a565b9050600003612098576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610bec565b6040805160a08101825267ffffffffffffffff88166000908152600360205291822080548291906120c890613b9a565b80601f01602080910402602001604051908101604052809291908181526020018280546120f490613b9a565b80156121415780601f1061211657610100808354040283529160200191612141565b820191906000526020600020905b81548152906001019060200180831161212457829003601f168201915b5050509183525050602080820188905260408083018a905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8b1660009081526003909252902060010180546080909201916121a290613b9a565b80601f01602080910402602001604051908101604052809291908181526020018280546121ce90613b9a565b801561221b5780601f106121f05761010080835404028352916020019161221b565b820191906000526020600020905b8154815290600101906020018083116121fe57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90612282908b908690600401614511565b602060405180830381865afa15801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c391906145de565b90507f000000000000000000000000000000000000000000000000000000000000000015801561230a575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15612334576007546123349073ffffffffffffffffffffffffffffffffffffffff16333084612e14565b60005b8751811015612487576123a733308a848151811061235757612357613bed565b6020026020010151602001518b858151811061237557612375613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e14909392919063ffffffff16565b600754885173ffffffffffffffffffffffffffffffffffffffff909116908990839081106123d7576123d7613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461247f57600254885161247f9173ffffffffffffffffffffffffffffffffffffffff16908a908490811061243057612430613bed565b6020026020010151602001518a848151811061244e5761244e613bed565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b1c9092919063ffffffff16565b600101612337565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156124ba5760006124bc565b825b8a856040518463ffffffff1660e01b81526004016124db929190614511565b60206040518083038185885af11580156124f9573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251e91906145de565b94507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8560405161255191815260200190565b60405180910390a1505050509392505050565b61256c612619565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b6125f5612619565b6115da81612e72565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bec565b806001166001036126dd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612711565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b61271a81611402565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161277291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156127ec57816020015b60408051808201909152600080825260208201528152602001906001900390816127c55790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061284360025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612893929190614511565b6020604051808303816000875af11580156128b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fd91906145de565b80471015612940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bec565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461299a576040519150601f19603f3d011682016040523d82523d6000602084013e61299f565b606091505b50509050806113fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bec565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113fd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f67565b60006126128383613073565b60006126128383613166565b801580612bbc57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bba91906145de565b155b612c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610bec565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113fd9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a82565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3991906145de565b612d4391906144fe565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612d9c9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a82565b50505050565b612daa612619565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612de69084906004016136e1565b600060405180830381600087803b158015612e0057600080fd5b505af11580156111f2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612d9c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a82565b3373ffffffffffffffffffffffffffffffffffffffff821603612ef1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bec565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612fc9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131b59092919063ffffffff16565b8051909150156113fd5780806020019051810190612fe791906145f7565b6113fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bec565b6000818152600183016020526040812054801561315c576000613097600183614614565b85549091506000906130ab90600190614614565b90508181146131105760008660000182815481106130cb576130cb613bed565b90600052602060002001549050808760000184815481106130ee576130ee613bed565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061312157613121614627565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106b9565b60009150506106b9565b60008181526001830160205260408120546131ad575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106b9565b5060006106b9565b60606131c484846000856131cc565b949350505050565b60608247101561325e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bec565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161328791906144ec565b60006040518083038185875af1925050503d80600081146132c4576040519150601f19603f3d011682016040523d82523d6000602084013e6132c9565b606091505b50915091506132da878383876132e5565b979650505050505050565b6060831561337b5782516000036133745773ffffffffffffffffffffffffffffffffffffffff85163b613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bec565b50816131c4565b6131c483838151156133905781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec91906135c3565b5080546133d090613b9a565b6000825580601f106133e0575050565b601f0160209004906000526020600020908101906115da919061341f565b50805460008255600202906000526020600020908101906115da9190613438565b5b808211156134345760008155600101613420565b5090565b5b808211156134345780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613439565b60006020828403121561348857600080fd5b5035919050565b67ffffffffffffffff811681146115da57600080fd5b6000806000604084860312156134ba57600080fd5b83356134c58161348f565b9250602084013567ffffffffffffffff808211156134e257600080fd5b818601915086601f8301126134f657600080fd5b81358181111561350557600080fd5b87602082850101111561351757600080fd5b6020830194508093505050509250925092565b80151581146115da57600080fd5b60006020828403121561354a57600080fd5b81356126128161352a565b60005b83811015613570578181015183820152602001613558565b50506000910152565b60008151808452613591816020860160208601613555565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126126020830184613579565b6000602082840312156135e857600080fd5b81356126128161348f565b6040815260006136066040830185613579565b82810360208401526136188185613579565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146115da57600080fd5b60008060006060848603121561365857600080fd5b833561366381613621565b9250602084013561367381613621565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136d6578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613699565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261371b60c0840182613579565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137578383613579565b925060808601519150808584030160a0860152506136188282613684565b6000806040838503121561378857600080fd5b82359150602083013561379a81613621565b809150509250929050565b60008083601f8401126137b757600080fd5b50813567ffffffffffffffff8111156137cf57600080fd5b6020830191508360208260051b85010111156137ea57600080fd5b9250929050565b6000806000806040858703121561380757600080fd5b843567ffffffffffffffff8082111561381f57600080fd5b61382b888389016137a5565b9096509450602087013591508082111561384457600080fd5b50613851878288016137a5565b95989497509550505050565b60006020828403121561386f57600080fd5b813567ffffffffffffffff81111561388657600080fd5b820160a0818503121561261257600080fd5b600080602083850312156138ab57600080fd5b823567ffffffffffffffff8111156138c257600080fd5b6138ce858286016137a5565b90969095509350505050565b600080604083850312156138ed57600080fd5b82356138f88161348f565b9150602083013561379a81613621565b60006020828403121561391a57600080fd5b813561261281613621565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561397757613977613925565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139c4576139c4613925565b604052919050565b600082601f8301126139dd57600080fd5b813567ffffffffffffffff8111156139f7576139f7613925565b613a2860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161397d565b818152846020838601011115613a3d57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a6f57600080fd5b8335613a7a8161348f565b925060208481013567ffffffffffffffff80821115613a9857600080fd5b818701915087601f830112613aac57600080fd5b813581811115613abe57613abe613925565b613acc848260051b0161397d565b81815260069190911b8301840190848101908a831115613aeb57600080fd5b938501935b82851015613b37576040858c031215613b095760008081fd5b613b11613954565b8535613b1c81613621565b81528587013587820152825260409094019390850190613af0565b965050506040870135925080831115613b4f57600080fd5b5050613b5d868287016139cc565b9150509250925092565b600060208284031215613b7957600080fd5b813560ff8116811461261257600080fd5b8183823760009101908152919050565b600181811c90821680613bae57607f821691505b602082108103613be7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c5057600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c8f57600080fd5b83018035915067ffffffffffffffff821115613caa57600080fd5b6020019150368190038213156137ea57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cf457600080fd5b830160208101925035905067ffffffffffffffff811115613d1457600080fd5b8036038213156137ea57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136d6578135613d8f81613621565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d7c565b602081528135602082015260006020830135613ddc8161348f565b67ffffffffffffffff8082166040850152613dfa6040860186613cbf565b925060a06060860152613e1160c086018483613d23565b925050613e216060860186613cbf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e57858385613d23565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e9057600080fd5b60209288019283019235915083821115613ea957600080fd5b8160061b3603831315613ebb57600080fd5b8685030160a08701526132da848284613d6c565b601f8211156113fd576000816000526020600020601f850160051c81016020861015613ef85750805b601f850160051c820191505b81811015613f1757828155600101613f04565b505050505050565b67ffffffffffffffff831115613f3757613f37613925565b613f4b83613f458354613b9a565b83613ecf565b6000601f841160018114613f9d5760008515613f675750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556111f2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fec5786850135825560209485019460019092019101613fcc565b5086821015614027577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561407381613621565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140d9576140d9613925565b8054838255808410156141665760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461411a5761411a614039565b808616861461412b5761412b614039565b5060008360005260206000208360011b81018760011b820191505b80821015614161578282558284830155600282019150614146565b505050505b5060008181526020812083915b85811015613f17576141858383614068565b6040929092019160029190910190600101614173565b813581556001810160208301356141b18161348f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141f16040860186613c5a565b93509150614203838360028701613f1f565b6142106060860186613c5a565b93509150614222838360038701613f1f565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261425957600080fd5b91840191823591508082111561426e57600080fd5b506020820191508060061b360382131561428757600080fd5b612d9c8183600486016140c0565b6000826142cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142e257600080fd5b815161261281613621565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c5057600080fd5b60006080823603121561433357600080fd5b6040516080810167ffffffffffffffff828210818311171561435757614357613925565b81604052843591506143688261348f565b90825260208401359061437a8261352a565b816020840152604085013591508082111561439457600080fd5b6143a0368387016139cc565b604084015260608501359150808211156143b957600080fd5b506143c6368286016139cc565b60608301525092915050565b815167ffffffffffffffff8111156143ec576143ec613925565b614400816143fa8454613b9a565b84613ecf565b602080601f831160018114614453576000841561441d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f17565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144a057888601518255948401946001909101908401614481565b50858210156144dc57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613c50818460208701613555565b808201808211156106b9576106b9614039565b67ffffffffffffffff83168152604060208201526000825160a0604084015261453d60e0840182613579565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145798383613579565b925060408601519150808584030160808601526145968383613684565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145d48282613579565b9695505050505050565b6000602082840312156145f057600080fd5b5051919050565b60006020828403121561460957600080fd5b81516126128161352a565b818103818111156106b9576106b9614039565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"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\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usePreFundedFeeTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPreFunded\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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: "0x60a06040523480156200001157600080fd5b5060405162004dc738038062004dc783398101604081905262000034916200060a565b82828181600182803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000182565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492861692909116821790558215156080521590506200014b576002546200014b906001600160a01b0384811691166000196200022d565b50505050508060026200015f919062000663565b600860156101000a81548160ff021916908360ff16021790555050505062000753565b336001600160a01b03821603620001dc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002ab5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a9919062000695565b155b6200031f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003779185916200037c16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003cb906001600160a01b0385169084906200044d565b805190915015620003775780806020019051810190620003ec9190620006af565b620003775760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b60606200045e848460008562000466565b949350505050565b606082471015620004c95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004e7919062000700565b60006040518083038185875af1925050503d806000811462000526576040519150601f19603f3d011682016040523d82523d6000602084013e6200052b565b606091505b5090925090506200053f878383876200054a565b979650505050505050565b60608315620005be578251600003620005b6576001600160a01b0385163b620005b65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b50816200045e565b6200045e8383815115620005d55781518083602001fd5b8060405162461bcd60e51b81526004016200008a91906200071e565b6001600160a01b03811681146200060757600080fd5b50565b6000806000606084860312156200062057600080fd5b83516200062d81620005f1565b60208501519093506200064081620005f1565b604085015190925060ff811681146200065857600080fd5b809150509250925092565b60ff81811683821602908116908181146200068e57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215620006a857600080fd5b5051919050565b600060208284031215620006c257600080fd5b81518015158114620006d357600080fd5b9392505050565b60005b83811015620006f7578181015183820152602001620006dd565b50506000910152565b6000825162000714818460208701620006da565b9190910192915050565b60208152600082518060208401526200073f816040850160208701620006da565b601f01601f19169190910160400192915050565b60805161465162000776600039600081816103b501526122b601526146516000f3fe6080604052600436106101d15760003560e01c80638f491cba116100f7578063c89245d511610095578063e6c725f511610064578063e6c725f51461060a578063e89b448514610648578063ef686d8e14610669578063f2fde38b1461068957600080fd5b8063c89245d51461057f578063ca709a251461059f578063cf6730f8146105ca578063e4ca8754146105ea57600080fd5b8063b187bd26116100d1578063b187bd26146104c4578063b5a11011146104f4578063bee518a414610514578063c851cc321461055f57600080fd5b80638f491cba146104595780639fe74e2614610479578063b0f479a11461049957600080fd5b80635e35359e1161016f57806379ba50971161013e57806379ba5097146103d95780638462a2b9146103ee57806385572ffb1461040e5780638da5cb5b1461042e57600080fd5b80635e35359e146103395780636939cd97146103595780636d62d6331461038657806372be9eb8146103a657600080fd5b8063181f5a77116101ab578063181f5a77146102545780632874d8bf146102aa5780632b6e5d63146102bf57806335f170ef1461030b57600080fd5b80630a9094dc146101dd5780630e958d6b1461021257806316c38b3c1461023257600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004613464565b6106a9565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506101fd61022d366004613493565b6106bc565b34801561023e57600080fd5b5061025261024d366004613526565b610707565b005b34801561026057600080fd5b5061029d6040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e362e30000000000000000081525081565b60405161020991906135b1565b3480156102b657600080fd5b50610252610759565b3480156102cb57600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b34801561031757600080fd5b5061032b6103263660046135c4565b610795565b6040516102099291906135e1565b34801561034557600080fd5b50610252610354366004613631565b6108c1565b34801561036557600080fd5b50610379610374366004613464565b610996565b60405161020991906136cf565b34801561039257600080fd5b506102526103a1366004613763565b610ba1565b3480156103b257600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006101fd565b3480156103e557600080fd5b50610252610db9565b3480156103fa57600080fd5b506102526104093660046137df565b610eb6565b34801561041a57600080fd5b5061025261042936600461384b565b6111f7565b34801561043a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102e6565b34801561046557600080fd5b50610252610474366004613464565b6113ee565b34801561048557600080fd5b50610252610494366004613886565b6115c9565b3480156104a557600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102e6565b3480156104d057600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101fd565b34801561050057600080fd5b5061025261050f3660046138c8565b611782565b34801561052057600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff9091168152602001610209565b34801561056b57600080fd5b5061025261057a3660046138f6565b61198a565b34801561058b57600080fd5b5061025261059a3660046138f6565b611a56565b3480156105ab57600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff166102e6565b3480156105d657600080fd5b506102526105e536600461384b565b611bc0565b3480156105f657600080fd5b50610252610605366004613464565b611d4b565b34801561061657600080fd5b506008547501000000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610209565b61065b610656366004613a48565b612019565b604051908152602001610209565b34801561067557600080fd5b50610252610684366004613b55565b612552565b34801561069557600080fd5b506102526106a43660046138f6565b6125db565b60006106b66005836125ec565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106eb9085908590613b78565b9081526040519081900360200190205460ff1690509392505050565b61070f612607565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610761612607565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107936001612688565b565b6003602052600090815260409020805481906107b090613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546107dc90613b88565b80156108295780601f106107fe57610100808354040283529160200191610829565b820191906000526020600020905b81548152906001019060200180831161080c57829003601f168201915b50505050509080600101805461083e90613b88565b80601f016020809104026020016040519081016040528092919081815260200182805461086a90613b88565b80156108b75780601f1061088c576101008083540402835291602001916108b7565b820191906000526020600020905b81548152906001019060200180831161089a57829003601f168201915b5050505050905082565b6108c9612607565b73ffffffffffffffffffffffffffffffffffffffff83166109095761090473ffffffffffffffffffffffffffffffffffffffff8316826128c4565b61092a565b61092a73ffffffffffffffffffffffffffffffffffffffff84168383612a1e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161098991815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610a0590613b88565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190613b88565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b50505050508152602001600382018054610a9790613b88565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac390613b88565b8015610b105780601f10610ae557610100808354040283529160200191610b10565b820191906000526020600020905b815481529060010190602001808311610af357829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610b935760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b3e565b505050915250909392505050565b610ba9612607565b610bb46005836125ec565b610bf2576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610c735760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610c1e565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610cc360028301826133b2565b610cd16003830160006133b2565b610cdf6004830160006133ec565b50610ced9050600584612af2565b5060005b8151811015610d6757610d5f83838381518110610d1057610d10613bdb565b602002602001015160200151848481518110610d2e57610d2e613bdb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612a1e9092919063ffffffff16565b600101610cf1565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610be9565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ebe612607565b60005b818110156110515760036000848484818110610edf57610edf613bdb565b9050602002810190610ef19190613c0a565b610eff9060208101906135c4565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610f3657610f36613bdb565b9050602002810190610f489190613c0a565b610f56906020810190613c48565b604051610f64929190613b78565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610fab57610fab613bdb565b9050602002810190610fbd9190613c0a565b610fcb906020810190613c48565b604051610fd9929190613b78565b6040518091039020838383818110610ff357610ff3613bdb565b90506020028101906110059190613c0a565b6110139060208101906135c4565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610ec1565b5060005b838110156111f05760016003600087878581811061107557611075613bdb565b90506020028101906110879190613c0a565b6110959060208101906135c4565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106110cc576110cc613bdb565b90506020028101906110de9190613c0a565b6110ec906020810190613c48565b6040516110fa929190613b78565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061114a5761114a613bdb565b905060200281019061115c9190613c0a565b61116a906020810190613c48565b604051611178929190613b78565b604051809103902085858381811061119257611192613bdb565b90506020028101906111a49190613c0a565b6111b29060208101906135c4565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611055565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461124a576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610be9565b61125a60408201602083016135c4565b67ffffffffffffffff81166000908152600360205260409020805461127e90613b88565b90506000036112c5576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610be9565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611301908590600401613daf565b600060405180830381600087803b15801561131b57600080fd5b505af192505050801561132c575060015b6113be573d80801561135a576040519150601f19603f3d011682016040523d82523d6000602084013e61135f565b606091505b5061136c60058435612afe565b508235600090815260046020526040902083906113898282614189565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610dac9084906135b1565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b6008547501000000000000000000000000000000000000000000900460ff16158061143657506008547501000000000000000000000000000000000000000000900460ff1681105b1561143e5750565b60085460019061146a907501000000000000000000000000000000000000000000900460ff1683614283565b116115c65760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa158015611519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153d91906142be565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561158457600080fd5b505af1158015611598573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6115d1612607565b60005b8181101561177d5760008383838181106115f0576115f0613bdb565b905060200281019061160291906142db565b61160b9061430f565b9050806020015161167657805167ffffffffffffffff166000908152600360205260408120611639916133b2565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611774565b8060400151516000036116b5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906116e090826143c0565b506060810151815167ffffffffffffffff1660009081526003602052604090206001019061170e90826143c0565b50806040015160405161172191906144da565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212836060015160405161176b91906135b1565b60405180910390a35b506001016115d4565b505050565b61178a612607565b73ffffffffffffffffffffffffffffffffffffffff811615806117b5575067ffffffffffffffff8216155b156117ec576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526118dd916144da565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff841660009081526003602052209061177d90826143c0565b611992612607565b73ffffffffffffffffffffffffffffffffffffffff81166119df576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611a5e612607565b60075473ffffffffffffffffffffffffffffffffffffffff1615611abf57611abf611a9e60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612b0a565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611b6c57611b6c611b2c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612c8c565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611bf9576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c0960408201602083016135c4565b611c166040830183613c48565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611c6d92509050613b88565b15905080611cc35750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611cae91906144da565b9081526040519081900360200190205460ff16155b15611cfc57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610be991906135b1565b60085474010000000000000000000000000000000000000000900460ff1661177d5761177d611d2e6060850185613c48565b810190611d3b9190613464565b611d469060016144ec565b612688565b611d566005826125ec565b611d8f576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610be9565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611dd690613b88565b80601f0160208091040260200160405190810160405280929190818152602001828054611e0290613b88565b8015611e4f5780601f10611e2457610100808354040283529160200191611e4f565b820191906000526020600020905b815481529060010190602001808311611e3257829003601f168201915b50505050508152602001600382018054611e6890613b88565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9490613b88565b8015611ee15780601f10611eb657610100808354040283529160200191611ee1565b820191906000526020600020905b815481529060010190602001808311611ec457829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611f645760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f0f565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611fb660028301826133b2565b611fc46003830160006133b2565b611fd26004830160006133ec565b50611fe09050600583612af2565b50611fea81612d90565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919061204090613b88565b9050600003612087576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610be9565b6040805160a08101825267ffffffffffffffff87166000908152600360205291822080548291906120b790613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546120e390613b88565b80156121305780601f1061210557610100808354040283529160200191612130565b820191906000526020600020905b81548152906001019060200180831161211357829003601f168201915b50505091835250506020808201879052604080830189905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8a16600090815260039092529020600101805460809092019161219190613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546121bd90613b88565b801561220a5780601f106121df5761010080835404028352916020019161220a565b820191906000526020600020905b8154815290600101906020018083116121ed57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90612271908a9086906004016144ff565b602060405180830381865afa15801561228e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b291906145cc565b90507f00000000000000000000000000000000000000000000000000000000000000001580156122f9575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15612323576007546123239073ffffffffffffffffffffffffffffffffffffffff16333084612e02565b60005b865181101561247657612396333089848151811061234657612346613bdb565b6020026020010151602001518a858151811061236457612364613bdb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e02909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106123c6576123c6613bdb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461246e57600254875161246e9173ffffffffffffffffffffffffffffffffffffffff169089908490811061241f5761241f613bdb565b60200260200101516020015189848151811061243d5761243d613bdb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612b0a9092919063ffffffff16565b600101612326565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156124a95760006124ab565b825b89856040518463ffffffff1660e01b81526004016124ca9291906144ff565b60206040518083038185885af11580156124e8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061250d91906145cc565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8460405161254091815260200190565b60405180910390a15050509392505050565b61255a612607565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b6125e3612607565b6115c681612e60565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610be9565b806001166001036126cb576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126ff565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612708816113ee565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161276091815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156127da57816020015b60408051808201909152600080825260208201528152602001906001900390816127b35790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040805191820181526000825290910152905061283160025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b81526004016128819291906144ff565b6020604051808303816000875af11580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177d91906145cc565b8047101561292e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610be9565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612988576040519150601f19603f3d011682016040523d82523d6000602084013e61298d565b606091505b505090508061177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610be9565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261177d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612f55565b60006126008383613061565b60006126008383613154565b801580612baa57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba891906145cc565b155b612c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610be9565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261177d9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a70565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2791906145cc565b612d3191906144ec565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612d8a9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612a70565b50505050565b612d98612607565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612dd49084906004016136cf565b600060405180830381600087803b158015612dee57600080fd5b505af11580156111f0573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612d8a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a70565b3373ffffffffffffffffffffffffffffffffffffffff821603612edf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610be9565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612fb7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131a39092919063ffffffff16565b80519091501561177d5780806020019051810190612fd591906145e5565b61177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610be9565b6000818152600183016020526040812054801561314a576000613085600183614602565b855490915060009061309990600190614602565b90508181146130fe5760008660000182815481106130b9576130b9613bdb565b90600052602060002001549050808760000184815481106130dc576130dc613bdb565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061310f5761310f614615565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106b6565b60009150506106b6565b600081815260018301602052604081205461319b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106b6565b5060006106b6565b60606131b284846000856131ba565b949350505050565b60608247101561324c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610be9565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161327591906144da565b60006040518083038185875af1925050503d80600081146132b2576040519150601f19603f3d011682016040523d82523d6000602084013e6132b7565b606091505b50915091506132c8878383876132d3565b979650505050505050565b606083156133695782516000036133625773ffffffffffffffffffffffffffffffffffffffff85163b613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610be9565b50816131b2565b6131b2838381511561337e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be991906135b1565b5080546133be90613b88565b6000825580601f106133ce575050565b601f0160209004906000526020600020908101906115c6919061340d565b50805460008255600202906000526020600020908101906115c69190613426565b5b80821115613422576000815560010161340e565b5090565b5b808211156134225780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613427565b60006020828403121561347657600080fd5b5035919050565b67ffffffffffffffff811681146115c657600080fd5b6000806000604084860312156134a857600080fd5b83356134b38161347d565b9250602084013567ffffffffffffffff808211156134d057600080fd5b818601915086601f8301126134e457600080fd5b8135818111156134f357600080fd5b87602082850101111561350557600080fd5b6020830194508093505050509250925092565b80151581146115c657600080fd5b60006020828403121561353857600080fd5b813561260081613518565b60005b8381101561355e578181015183820152602001613546565b50506000910152565b6000815180845261357f816020860160208601613543565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126006020830184613567565b6000602082840312156135d657600080fd5b81356126008161347d565b6040815260006135f46040830185613567565b82810360208401526136068185613567565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146115c657600080fd5b60008060006060848603121561364657600080fd5b83356136518161360f565b925060208401356136618161360f565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156136c4578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613687565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261370960c0840182613567565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526137458383613567565b925060808601519150808584030160a0860152506136068282613672565b6000806040838503121561377657600080fd5b8235915060208301356137888161360f565b809150509250929050565b60008083601f8401126137a557600080fd5b50813567ffffffffffffffff8111156137bd57600080fd5b6020830191508360208260051b85010111156137d857600080fd5b9250929050565b600080600080604085870312156137f557600080fd5b843567ffffffffffffffff8082111561380d57600080fd5b61381988838901613793565b9096509450602087013591508082111561383257600080fd5b5061383f87828801613793565b95989497509550505050565b60006020828403121561385d57600080fd5b813567ffffffffffffffff81111561387457600080fd5b820160a0818503121561260057600080fd5b6000806020838503121561389957600080fd5b823567ffffffffffffffff8111156138b057600080fd5b6138bc85828601613793565b90969095509350505050565b600080604083850312156138db57600080fd5b82356138e68161347d565b915060208301356137888161360f565b60006020828403121561390857600080fd5b81356126008161360f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561396557613965613913565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139b2576139b2613913565b604052919050565b600082601f8301126139cb57600080fd5b813567ffffffffffffffff8111156139e5576139e5613913565b613a1660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161396b565b818152846020838601011115613a2b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613a5d57600080fd5b8335613a688161347d565b925060208481013567ffffffffffffffff80821115613a8657600080fd5b818701915087601f830112613a9a57600080fd5b813581811115613aac57613aac613913565b613aba848260051b0161396b565b81815260069190911b8301840190848101908a831115613ad957600080fd5b938501935b82851015613b25576040858c031215613af75760008081fd5b613aff613942565b8535613b0a8161360f565b81528587013587820152825260409094019390850190613ade565b965050506040870135925080831115613b3d57600080fd5b5050613b4b868287016139ba565b9150509250925092565b600060208284031215613b6757600080fd5b813560ff8116811461260057600080fd5b8183823760009101908152919050565b600181811c90821680613b9c57607f821691505b602082108103613bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613c3e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613c7d57600080fd5b83018035915067ffffffffffffffff821115613c9857600080fd5b6020019150368190038213156137d857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613ce257600080fd5b830160208101925035905067ffffffffffffffff811115613d0257600080fd5b8036038213156137d857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156136c4578135613d7d8161360f565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613d6a565b602081528135602082015260006020830135613dca8161347d565b67ffffffffffffffff8082166040850152613de86040860186613cad565b925060a06060860152613dff60c086018483613d11565b925050613e0f6060860186613cad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613e45858385613d11565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613e7e57600080fd5b60209288019283019235915083821115613e9757600080fd5b8160061b3603831315613ea957600080fd5b8685030160a08701526132c8848284613d5a565b601f82111561177d576000816000526020600020601f850160051c81016020861015613ee65750805b601f850160051c820191505b81811015613f0557828155600101613ef2565b505050505050565b67ffffffffffffffff831115613f2557613f25613913565b613f3983613f338354613b88565b83613ebd565b6000601f841160018114613f8b5760008515613f555750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556111f0565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613fda5786850135825560209485019460019092019101613fba565b5086821015614015577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81356140618161360f565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156140c7576140c7613913565b8054838255808410156141545760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461410857614108614027565b808616861461411957614119614027565b5060008360005260206000208360011b81018760011b820191505b8082101561414f578282558284830155600282019150614134565b505050505b5060008181526020812083915b85811015613f05576141738383614056565b6040929092019160029190910190600101614161565b8135815560018101602083013561419f8161347d565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556141df6040860186613c48565b935091506141f1838360028701613f0d565b6141fe6060860186613c48565b93509150614210838360038701613f0d565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261424757600080fd5b91840191823591508082111561425c57600080fd5b506020820191508060061b360382131561427557600080fd5b612d8a8183600486016140ae565b6000826142b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000602082840312156142d057600080fd5b81516126008161360f565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c3e57600080fd5b60006080823603121561432157600080fd5b6040516080810167ffffffffffffffff828210818311171561434557614345613913565b81604052843591506143568261347d565b90825260208401359061436882613518565b816020840152604085013591508082111561438257600080fd5b61438e368387016139ba565b604084015260608501359150808211156143a757600080fd5b506143b4368286016139ba565b60608301525092915050565b815167ffffffffffffffff8111156143da576143da613913565b6143ee816143e88454613b88565b84613ebd565b602080601f831160018114614441576000841561440b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f05565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561448e5788860151825594840194600190910190840161446f565b50858210156144ca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251613c3e818460208701613543565b808201808211156106b6576106b6614027565b67ffffffffffffffff83168152604060208201526000825160a0604084015261452b60e0840182613567565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526145678383613567565b925060408601519150808584030160808601526145848383613672565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145c28282613567565b9695505050505050565b6000602082840312156145de57600080fd5b5051919050565b6000602082840312156145f757600080fd5b815161260081613518565b818103818111156106b6576106b6614027565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -262,6 +262,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetCounterpartChainS return _SelfFundedPingPong.Contract.GetCounterpartChainSelector(&_SelfFundedPingPong.CallOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SelfFundedPingPong.contract.Call(opts, &out, "getFeeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SelfFundedPingPong *SelfFundedPingPongSession) GetFeeToken() (common.Address, error) { + return _SelfFundedPingPong.Contract.GetFeeToken(&_SelfFundedPingPong.CallOpts) +} + +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetFeeToken() (common.Address, error) { + return _SelfFundedPingPong.Contract.GetFeeToken(&_SelfFundedPingPong.CallOpts) +} + func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "getMessageContents", messageId) @@ -306,28 +328,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetRouter() (common. return _SelfFundedPingPong.Contract.GetRouter(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) IIsPreFunded(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "i_isPreFunded") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) IIsPreFunded() (bool, error) { - return _SelfFundedPingPong.Contract.IIsPreFunded(&_SelfFundedPingPong.CallOpts) -} - -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) IIsPreFunded() (bool, error) { - return _SelfFundedPingPong.Contract.IIsPreFunded(&_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) @@ -446,48 +446,48 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SChainConfigs(destCh return _SelfFundedPingPong.Contract.SChainConfigs(&_SelfFundedPingPong.CallOpts, destChainSelector) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) SFeeToken(opts *bind.CallOpts) (common.Address, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "s_feeToken") + err := _SelfFundedPingPong.contract.Call(opts, &out, "typeAndVersion") if err != nil { - return *new(common.Address), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -func (_SelfFundedPingPong *SelfFundedPingPongSession) SFeeToken() (common.Address, error) { - return _SelfFundedPingPong.Contract.SFeeToken(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongSession) TypeAndVersion() (string, error) { + return _SelfFundedPingPong.Contract.TypeAndVersion(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) SFeeToken() (common.Address, error) { - return _SelfFundedPingPong.Contract.SFeeToken(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) TypeAndVersion() (string, error) { + return _SelfFundedPingPong.Contract.TypeAndVersion(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { +func (_SelfFundedPingPong *SelfFundedPingPongCaller) UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, error) { var out []interface{} - err := _SelfFundedPingPong.contract.Call(opts, &out, "typeAndVersion") + err := _SelfFundedPingPong.contract.Call(opts, &out, "usePreFundedFeeTokens") if err != nil { - return *new(string), err + return *new(bool), err } - out0 := *abi.ConvertType(out[0], new(string)).(*string) + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err } -func (_SelfFundedPingPong *SelfFundedPingPongSession) TypeAndVersion() (string, error) { - return _SelfFundedPingPong.Contract.TypeAndVersion(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongSession) UsePreFundedFeeTokens() (bool, error) { + return _SelfFundedPingPong.Contract.UsePreFundedFeeTokens(&_SelfFundedPingPong.CallOpts) } -func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) TypeAndVersion() (string, error) { - return _SelfFundedPingPong.Contract.TypeAndVersion(&_SelfFundedPingPong.CallOpts) +func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) UsePreFundedFeeTokens() (bool, error) { + return _SelfFundedPingPong.Contract.UsePreFundedFeeTokens(&_SelfFundedPingPong.CallOpts) } func (_SelfFundedPingPong *SelfFundedPingPongTransactor) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) { @@ -3131,12 +3131,12 @@ type SelfFundedPingPongInterface interface { GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) + GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) GetRouter(opts *bind.CallOpts) (common.Address, error) - IIsPreFunded(opts *bind.CallOpts) (bool, error) - IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) @@ -3149,10 +3149,10 @@ type SelfFundedPingPongInterface interface { error) - SFeeToken(opts *bind.CallOpts) (common.Address, error) - TypeAndVersion(opts *bind.CallOpts) (string, error) + UsePreFundedFeeTokens(opts *bind.CallOpts) (bool, 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 a90e591e96..545c9e8701 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,11 +5,11 @@ 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 fcb85edfc871504a5146db2e3951193c2de089fe491dd7a2fbc755fd92725cac burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 17bcd03828f43f50028bc4d66fdfb0cf576aaf28895d8f86c6ff598159a0cd64 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6f40135e1488097eafa843839a719fe9a3c21354565b64eb377a24a0a55782ef -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin dea752d9f9ecb72854411e2f399082494dba2c26aece40ea05b99b11475dfd27 -ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 2e093409dbafb72f601d469e345c765fc348c03814f5dce9573ef6cf26644f01 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 96612451718090a67090a12388702b808f13a99e615c8c0c51d45f3626f19b3e -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 0e233fa128510939f1b8325f6bbeb6b4fd79edd1d9c663a86b12771f25738c3d -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin cf9f78a1cb3873bb76b6c9873c7cc12cd2d5f3a75e4dabc44fd6d53de4254747 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 4fa80572165c135051c8f90db530de2da2ffd5f99101cc59e50fa61f2aabccf2 +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 928d49f02f9aef05f27072ebe6de798a655f5b6e48fbe5be7dba185888d60384 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 74f2cedde31d15d881087da352f82668cfc4a11bce6b6a0af6f8fd0c0718cae5 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 4eb6ce9f4b68c766b2c01f37d12a39a89bfa7636330ddc19b9d038de2f76e795 +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 3e74689a26f094eddf4d2fc8ae16b799dcf8732a2de116748f43f93fba3093e7 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c06c1cf1d004a803585a2c9d7a71ee5997b5fca86c2e111335cb8b930d9e3b5a 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 @@ -30,12 +30,12 @@ multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRate multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin aa299e0c2659d53aad4eace4d66be0e734b1366008593669cf30361ff529da6a nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 077b9a1c121c78395b4d2b92a5a278ea84705c3fa13d37fca6aa02f3848f0b44 -price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 0b3e253684d7085aa11f9179b71453b9db9d11cabea41605d5b4ac4128f85bfb +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 5531cf7b66f8f88c49207d8f16f0e7f06b1833ab178471939f1c05c871a16328 +price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 09cdd37920d6f605c8a264f805bdba183813517169b2b5df4547e995d9ce73f7 registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 7b2a47349d3fdb8d8b4e206d68577219deca7fabd1e893686fa8f118ad980d2d report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 6960e1fee45ddc3f165ff8ea27d187d42b0d1891f97f5f31354e63167c2503f9 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 1f41c4136108601c04e9cca14af74a9b3c2f4be82898043f9695542d708940ca token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4 token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin a54136ed9bffc74fff830c5066dbfcee6db1f31d636795317267d6baf1e0427a From 686ac308335ebebf4221b31899981d6017d6c0a4 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 19 Jul 2024 12:52:46 -0400 Subject: [PATCH 57/61] gas snapshot fix --- contracts/gas-snapshots/ccip.gas-snapshot | 47 +++++++++++------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index bd983a6813..75096fecf7 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -35,16 +35,16 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243552) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260) CCIPClientTest:test_HappyPath_Success() (gas: 192136) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325519) -CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218625) -CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376524) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 325676) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218709) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 376778) CCIPClientTest:test_modifyFeeToken_Success() (gas: 74403) -CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328271) -CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415364) -CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 345065) -CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242836) -CCIPClientWithACKTest:test_ccipSend_with_NativeFeeToken_andNoDestTokens_Success() (gas: 399341) -CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 551947) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 328367) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415370) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 345200) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242920) +CCIPClientWithACKTest:test_ccipSend_with_NativeFeeToken_andNoDestTokens_Success() (gas: 399595) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552014) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647) @@ -113,13 +113,13 @@ CCIPReceiverTest:test_retryFailedMessage_which_has_not_already_failed_Revert() ( CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20876) CCIPReceiverWithAckTest:test_attemptACK_message_which_has_already_been_acknowledged_Revert() (gas: 406869) CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 53229) -CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 328101) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 328185) CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415299) CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2831876) CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74818) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339014) -CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224259) -CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367558) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 339171) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224343) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 367841) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -148,8 +148,6 @@ 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) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) -DefensiveExampleTest:test_Recovery() (gas: 424253) E2E:test_E2E_3MessagesSuccess_gas() (gas: 1103438) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38157) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108343) @@ -226,7 +224,7 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (ga EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181353) EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190627) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48053) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 443030) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1599026) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 251770) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 173962) EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193657) @@ -252,8 +250,8 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouche EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207379) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26004) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152867) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507480) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2307925) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1663623) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 3348114) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209633) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210210) EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 668610) @@ -381,14 +379,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131682) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483328) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1639579) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186413) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25824) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43449) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25927) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188518) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187965) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027441) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3092231) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143803) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) @@ -677,9 +675,10 @@ OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380360) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 148380) -PingPong_plumbing:test_Pausing_Success() (gas: 17803) -PingPong_startPingPong:test_StartPingPong_Success() (gas: 178340) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 177558) +PingPong_example_plumbing:test_Pausing_Success() (gas: 17877) +PingPong_example_plumbing:test_typeAndVersion() (gas: 9741) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 202042) PriceRegistry_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16719) PriceRegistry_applyDestChainConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 16784) PriceRegistry_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16611) @@ -893,7 +892,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: 268756) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444236) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 444404) SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20161) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947) From ab28217b0092787ab4684538c5ec376178e329f0 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 30 Jul 2024 13:12:30 -0400 Subject: [PATCH 58/61] comment formatting cleanup --- .../external/CCIPReceiverWithACK.sol | 16 ++++++++++------ .../ccip/applications/external/CCIPSender.sol | 16 +++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index 8711e71504..a86db8c248 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -29,24 +29,27 @@ contract CCIPReceiverWithACK is CCIPReceiver { enum MessageType { OUTGOING, // Indicates that a message is being sent for the first time to its recipient. - ACK // Indicates that another message of type "OUTGOING" has already been received, and an acknowledgement is being returned to the original sender, by the original recipient. + ACK // Indicates that another message of type "OUTGOING" has already been received, and an acknowledgement is being + // returned to the original sender, by the original recipient. } enum MessageStatus { QUIET, // A message which has not been sent yet, the default status for any messageId SENT, // Indicates a message has been sent through CCIP but not yet received an ACK response from the recipient - ACKNOWLEDGED // The original SENT message was received and processed by the recipient, and confirmation of reception was received by this via the returned ACK message sent in response. + ACKNOWLEDGED // The original SENT message was received and processed by the recipient, and confirmation of + // reception was received by this via the returned ACK message sent in response. } struct MessagePayload { - bytes version; // An optional byte string which can be used to denote the ACK version formatting or how to decode the remaining arbitrary data. + bytes version; // An optional byte string which can be used to denote the ACK version formatting or how to decode remaining data. bytes data; // The Arbitrary data initially meant to be received by this contract and sent from the source chain. - MessageType messageType; // Denotes whether the incoming message is being received for the first time, or is an acknowledgement that the initial outgoing correspondence was successfully received. + MessageType messageType; // Denotes whether the incoming message is being received for the first time, or is an + // acknowledgement that the initial outgoing correspondence was successfully received. } - // The keccak256 hash of the string "MESSAGE_ACKNOWLEDGED_" + // keccak256("MESSAGE_ACKNOWLEDGED_)" bytes32 public constant ACK_MESSAGE_HEADER = 0x1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b2; // Current feeToken @@ -123,7 +126,8 @@ contract CCIPReceiverWithACK is CCIPReceiver { /// @notice Sends the acknowledgement message back through CCIP to original sender contract function _sendAck(Client.Any2EVMMessage calldata incomingMessage) internal { - // Build the outgoing ACK message, with no tokens, with data being the concatenation of the acknowledgement header and incoming-messageId + // 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 1e31cbd79e..a770cde5ef 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPSender.sol @@ -13,16 +13,8 @@ import {SafeERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ /// @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. /// @dev The ccipSend function does not support pre-funding message-fees, and must acquire fee-tokens from the -/// user before the call to the router is made +/// user before the call to the router is made. contract CCIPSender is CCIPBase { using SafeERC20 for IERC20; @@ -31,6 +23,12 @@ contract CCIPSender is CCIPBase { constructor(address router) CCIPBase(router) {} /// @notice sends a message through CCIP to the router + /// @param destChainSelector A CCIP-Specific and unique chain identifier + /// @param tokenAmounts An array of token addresses and amounts to trasfer from the user and forward to the router + /// @param data Arbitrary data to be sent through CCIP to the destination contract. If the destination contract is an + /// EOA, then no calls will be made, and only the tokens forwarded. + /// @param feeToken The token used to pay for fees in CCIP. address(0) denotes paying fees in native chain tokens. + /// @return messageId the unique identifier for a message determined by the router when a message is sent. function ccipSend( uint64 destChainSelector, Client.EVMTokenAmount[] memory tokenAmounts, From 7b20a73b58e10202c5e37d840cfcb20c1e00502b Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 31 Jul 2024 11:12:40 -0400 Subject: [PATCH 59/61] gas snapshot fixes --- contracts/gas-snapshots/ccip.gas-snapshot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index a940794198..bd768032af 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -362,7 +362,7 @@ EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546987) EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64023) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123223) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143411) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 428233) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 1584251) EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20582) EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 281891) EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20231) @@ -379,14 +379,14 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131682) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483110) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 1639361) EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 185977) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25824) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43449) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25927) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188300) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187747) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027223) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 3092013) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143585) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) From e01e113a5ddaeabecdb72a2369e4438de41ec01d Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 5 Sep 2024 13:43:44 -0400 Subject: [PATCH 60/61] fix compilation and test issues that arose during merge --- .../scripts/native_solc_compile_all_ccip | 6 - .../internal/CCIPReceiverLegacy.sol | 2 +- .../applications/internal/PingPongDemo.sol | 30 + .../external/CCIPClientWithACKTest.t.sol | 3 +- .../external/CCIPReceiverWithAckTest.t.sol | 2 +- .../internal/PingPongDemoTest.t.sol | 53 +- .../receivers/ReentrancyAbuserMultiRamp.sol | 4 +- .../ccipReceiverWithAck.go | 114 +- .../ccip/generated/offramp/offramp.go | 2 +- .../ping_pong_demo/ping_pong_demo.go | 2023 +++++++++++++++-- .../self_funded_ping_pong.go | 1117 +++++++-- ...rapper-dependency-versions-do-not-edit.txt | 16 +- 12 files changed, 2861 insertions(+), 511 deletions(-) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 94c97be0c9..22661b149b 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -32,10 +32,6 @@ compileContract () { echo "OffRamp uses $OPTIMIZE_RUNS_OFFRAMP optimizer runs." optimize_runs=$OPTIMIZE_RUNS_OFFRAMP ;; - "ccip/offRamp/OffRamp.sol") - echo "MultiOffRamp uses $OPTIMIZE_RUNS_MULTI_OFFRAMP optimizer runs." - optimize_runs=$OPTIMIZE_RUNS_MULTI_OFFRAMP - ;; "ccip/onRamp/EVM2EVMOnRamp.sol") echo "OnRamp uses $OPTIMIZE_RUNS_ONRAMP optimizer runs." optimize_runs=$OPTIMIZE_RUNS_ONRAMP @@ -58,7 +54,6 @@ compileContract () { # Solc produces and overwrites intermediary contracts. # 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/internal/PingPongDemo.sol compileContract ccip/applications/internal/SelfFundedPingPong.sol compileContract ccip/applications/external/CCIPClient.sol @@ -66,7 +61,6 @@ compileContract ccip/applications/external/CCIPClientWithACK.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/offRamp/OffRamp.sol compileContract ccip/rmn/RMNRemote.sol compileContract ccip/onRamp/OnRamp.sol diff --git a/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol b/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol index 2022a12e95..86df282dbb 100644 --- a/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol +++ b/contracts/src/v0.8/ccip/applications/internal/CCIPReceiverLegacy.sol @@ -5,7 +5,7 @@ import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver. import {Client} from "../../libraries/Client.sol"; -import {IERC165} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"; /// @title CCIPReceiver - Base contract for CCIP applications that can receive messages. abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 { diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 5da5d14070..17a8be93b7 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -4,12 +4,17 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; import {CCIPClient} from "../external/CCIPClient.sol"; +import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; +import {IRouter} from "../../interfaces/IRouter.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 CCIPClient { + event Ping(uint256 pingPongCount); event Pong(uint256 pingPongCount); + event OutOfOrderExecutionChange(bool isOutOfOrder); // The chain ID of the counterpart ping pong contract uint64 internal s_counterpartChainSelector; @@ -20,6 +25,8 @@ contract PingPongDemo is CCIPClient { // Pause ping-ponging bool private s_isPaused; + bool private s_allowOutOfOrderExecution; + // CCIPClient will handle the token approval so there's no need to do it here constructor(address router, IERC20 feeToken) CCIPClient(router, feeToken, true) {} @@ -98,4 +105,27 @@ contract PingPongDemo is CCIPClient { function isPaused() external view returns (bool) { return s_isPaused; } + + function getOutOfOrderExecution() external view returns (bool) { + return s_allowOutOfOrderExecution; + } + + function setOutOfOrderExecution(bool outOfOrderExecution) external onlyOwner { + // It adds gas having the extra storage slot, but the alternative is a bunch of very messy assembly code + // to slice it out of the extra args. + s_allowOutOfOrderExecution = outOfOrderExecution; + + address onRamp = IRouter(s_ccipRouter).getOnRamp(s_counterpartChainSelector); + EVM2EVMOnRamp.StaticConfig memory staticConfig = EVM2EVMOnRamp(onRamp).getStaticConfig(); + + // Enabling out of order execution also requires setting a manual gas limit, therefore the on-ramp default + // gas limit is used to ensure consistency, but can be overwritten manually by the contract owner using + // the applyChainUpdates function. + s_chainConfigs[s_counterpartChainSelector].extraArgsBytes = Client._argsToBytes( + Client.EVMExtraArgsV2({gasLimit: staticConfig.defaultTxGasLimit, allowOutOfOrderExecution: outOfOrderExecution}) + ); + + emit OutOfOrderExecutionChange(outOfOrderExecution); + } + } diff --git a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol index 60039ee14f..d0a47a4b2b 100644 --- a/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/external/CCIPClientWithACKTest.t.sol @@ -107,7 +107,8 @@ contract CCIPClientWithACKTest is EVM2EVMOnRampSetup { uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_sender)); - vm.expectEmit(true, true, false, false); + // Check the messageId since we can control that, but not ackMessageId since its generated at execution time + vm.expectEmit(true, false, true, false, address(s_sender)); emit MessageSent(messageId, ackMessageId); s_sender.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 1d97d141de..370eb5c637 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 @@ -72,7 +72,7 @@ contract CCIPReceiverWithAckTest is EVM2EVMOnRampSetup { uint256 receiverBalanceBefore = IERC20(s_sourceFeeToken).balanceOf(address(s_receiver)); - vm.expectEmit(false, true, false, false); + vm.expectEmit(true, false, true, false); emit MessageSent(messageId, ackMessageId); s_receiver.ccipReceive( diff --git a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol index 83946e15e9..8f9f9c06aa 100644 --- a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol @@ -29,9 +29,45 @@ contract PingPongDappSetup is EVM2EVMOnRampSetup { } contract PingPong_example_startPingPong is PingPongDappSetup { - function test_StartPingPong_Success() public { uint256 pingPongNumber = 1; - bytes memory data = abi.encode(pingPongNumber); + bytes data = abi.encode(pingPongNumber); + + function test_StartPingPong_Success() public { + 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(); + } function test_StartPingPong_With_Sequenced_Ordered_Success() public { Client.EVM2AnyMessage memory sentMessage = Client.EVM2AnyMessage({ @@ -86,7 +122,7 @@ contract PingPong_example_startPingPong is PingPongDappSetup { data: abi.encode(pingPongNumber), tokenAmounts: sentMessage.tokenAmounts, sourceTokenData: new bytes[](sentMessage.tokenAmounts.length), - gasLimit: 200_000, + gasLimit: GAS_LIMIT, feeToken: sentMessage.feeToken, strict: false, messageId: "" @@ -133,19 +169,24 @@ contract PingPong_example_ccipReceive is PingPongDappSetup { contract PingPong_plumbing is PingPongDappSetup { function test_Fuzz_CounterPartChainSelector_Success(uint64 chainSelector) public { - s_pingPong.setCounterpartChainSelector(chainSelector); + vm.assume(chainSelector != 0); + + s_pingPong.setCounterpart(chainSelector, address(0x1234)); assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); } function test_Fuzz_CounterPartAddress_Success(address counterpartAddress) public { - s_pingPong.setCounterpartAddress(counterpartAddress); + vm.assume(counterpartAddress != address(0)); + + s_pingPong.setCounterpart(1, counterpartAddress); assertEq(s_pingPong.getCounterpartAddress(), counterpartAddress); } function test_Fuzz_CounterPartAddress_Success(uint64 chainSelector, address counterpartAddress) public { - s_pingPong.setCounterpartChainSelector(chainSelector); + vm.assume(chainSelector != 0); + vm.assume(counterpartAddress != address(0)); s_pingPong.setCounterpart(chainSelector, counterpartAddress); 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 0d2081b201..4467458dac 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol @@ -3,7 +3,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 {EVM2EVMOffRamp} from "../../../offRamp/EVM2EVMOffRamp.sol"; import {CCIPReceiverBasic} from "./CCIPReceiverBasic.sol"; import {OffRamp} from "../../../offRamp/OffRamp.sol"; @@ -14,7 +14,7 @@ contract ReentrancyAbuserMultiRamp is CCIPReceiverBasic { Internal.ExecutionReportSingleChain internal s_payload; OffRamp internal s_offRamp; - constructor(address router, EVM2EVMMultiOffRamp offRamp) CCIPReceiverBasic(router) { + constructor(address router, OffRamp offRamp) CCIPReceiverBasic(router) { s_offRamp = offRamp; } diff --git a/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go b/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go index 9471551845..cc2325c298 100644 --- a/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go +++ b/core/gethwrappers/ccip/generated/ccipReceiverWithAck/ccipReceiverWithAck.go @@ -56,8 +56,8 @@ type ClientEVMTokenAmount struct { } var CCIPReceiverWithACKMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageContents\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"getMessageStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"senderAddr\",\"type\":\"bytes\"}],\"name\":\"isApprovedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200440438038062004404833981016040819052620000349162000565565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000141565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556008805492851692909116821790551590506200013957620001396001600160a01b03821683600019620001ec565b50506200068a565b336001600160a01b038216036200019b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002649190620005a4565b620002709190620005be565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cc91869190620002d216565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000321906001600160a01b038516908490620003a8565b805190915015620003a35780806020019051810190620003429190620005e6565b620003a35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b505050565b6060620003b98484600085620003c1565b949350505050565b606082471015620004245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000442919062000637565b60006040518083038185875af1925050503d806000811462000481576040519150601f19603f3d011682016040523d82523d6000602084013e62000486565b606091505b5090925090506200049a87838387620004a5565b979650505050505050565b606083156200051957825160000362000511576001600160a01b0385163b620005115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b5081620003b9565b620003b98383815115620005305781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000655565b6001600160a01b03811681146200056257600080fd5b50565b600080604083850312156200057957600080fd5b825162000586816200054c565b602084015190925062000599816200054c565b809150509250929050565b600060208284031215620005b757600080fd5b5051919050565b80820180821115620005e057634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f957600080fd5b815180151581146200060a57600080fd5b9392505050565b60005b838110156200062e57818101518382015260200162000614565b50506000910152565b600082516200064b81846020870162000611565b9190910192915050565b60208152600082518060208401526200067681604085016020870162000611565b601f01601f19169190910160400192915050565b613d6a806200069a6000396000f3fe60806040526004361061016e5760003560e01c80638462a2b9116100cb578063c851cc321161007f578063e4ca875411610059578063e4ca87541461047d578063f2fde38b1461049d578063ff2deec3146104bd57600080fd5b8063c851cc321461041d578063c89245d51461043d578063cf6730f81461045d57600080fd5b80638da5cb5b116100b05780638da5cb5b146103865780639fe74e26146103d2578063b0f479a1146103f257600080fd5b80638462a2b91461034657806385572ffb1461036657600080fd5b80635e35359e116101225780636d62d633116101075780636d62d633146102bb5780636fef519e146102db57806379ba50971461033157600080fd5b80635e35359e1461026e5780636939cd971461028e57600080fd5b806335f170ef1161015357806335f170ef146101f05780635075a9d41461021e578063536c6bfa1461024c57600080fd5b806305bfe9821461017a5780630e958d6b146101c057600080fd5b3661017557005b600080fd5b34801561018657600080fd5b506101aa610195366004612d33565b60096020526000908152604090205460ff1681565b6040516101b79190612d7b565b60405180910390f35b3480156101cc57600080fd5b506101e06101db366004612dd2565b6104ea565b60405190151581526020016101b7565b3480156101fc57600080fd5b5061021061020b366004612e57565b610535565b6040516101b7929190612ee2565b34801561022a57600080fd5b5061023e610239366004612d33565b610661565b6040519081526020016101b7565b34801561025857600080fd5b5061026c610267366004612f32565b610674565b005b34801561027a57600080fd5b5061026c610289366004612f5e565b6106d8565b34801561029a57600080fd5b506102ae6102a9366004612d33565b61076d565b6040516101b79190612ffc565b3480156102c757600080fd5b5061026c6102d6366004613090565b610978565b3480156102e757600080fd5b506103246040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f000000000000000000000081525081565b6040516101b791906130c0565b34801561033d57600080fd5b5061026c610c92565b34801561035257600080fd5b5061026c61036136600461311f565b610d8f565b34801561037257600080fd5b5061026c61038136600461318b565b6110d0565b34801561039257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b3480156103de57600080fd5b5061026c6103ed3660046131c6565b6112d9565b3480156103fe57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103ad565b34801561042957600080fd5b5061026c610438366004613208565b61166a565b34801561044957600080fd5b5061026c610458366004613208565b611736565b34801561046957600080fd5b5061026c61047836600461318b565b6118aa565b34801561048957600080fd5b5061026c610498366004612d33565b611bf8565b3480156104a957600080fd5b5061026c6104b8366004613208565b611e62565b3480156104c957600080fd5b506008546103ad9073ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff831660009081526003602052604080822090516002909101906105199085908590613225565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061055090613235565b80601f016020809104026020016040519081016040528092919081815260200182805461057c90613235565b80156105c95780601f1061059e576101008083540402835291602001916105c9565b820191906000526020600020905b8154815290600101906020018083116105ac57829003601f168201915b5050505050908060010180546105de90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461060a90613235565b80156106575780601f1061062c57610100808354040283529160200191610657565b820191906000526020600020905b81548152906001019060200180831161063a57829003601f168201915b5050505050905082565b600061066e600583611e76565b92915050565b61067c611e89565b6106868282611f0c565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e9060200160405180910390a35050565b6106e0611e89565b61070173ffffffffffffffffffffffffffffffffffffffff84168383612066565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161076091815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff16918301919091526002810180549394929391928401916107dc90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461080890613235565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050815260200160038201805461086e90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461089a90613235565b80156108e75780601f106108bc576101008083540402835291602001916108e7565b820191906000526020600020905b8154815290600101906020018083116108ca57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561096a5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610915565b505050915250909392505050565b610980611e89565b600161098d600584611e76565b146109cc576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6109dc8260025b6005919061213a565b506000828152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191610a2490613235565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090613235565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b50505050508152602001600382018054610ab690613235565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290613235565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610bb25760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610b5d565b5050505081525050905060005b816080015151811015610c4157610c398383608001518381518110610be657610be6613288565b60200260200101516020015184608001518481518110610c0857610c08613288565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166120669092919063ffffffff16565b600101610bbf565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a9579060200160405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109c3565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d97611e89565b60005b81811015610f2a5760036000848484818110610db857610db8613288565b9050602002810190610dca91906132b7565b610dd8906020810190612e57565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610e0f57610e0f613288565b9050602002810190610e2191906132b7565b610e2f9060208101906132f5565b604051610e3d929190613225565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610e8457610e84613288565b9050602002810190610e9691906132b7565b610ea49060208101906132f5565b604051610eb2929190613225565b6040518091039020838383818110610ecc57610ecc613288565b9050602002810190610ede91906132b7565b610eec906020810190612e57565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610d9a565b5060005b838110156110c957600160036000878785818110610f4e57610f4e613288565b9050602002810190610f6091906132b7565b610f6e906020810190612e57565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610fa557610fa5613288565b9050602002810190610fb791906132b7565b610fc59060208101906132f5565b604051610fd3929190613225565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061102357611023613288565b905060200281019061103591906132b7565b6110439060208101906132f5565b604051611051929190613225565b604051809103902085858381811061106b5761106b613288565b905060200281019061107d91906132b7565b61108b906020810190612e57565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610f2e565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611123576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016109c3565b6111336040820160208301612e57565b67ffffffffffffffff811660009081526003602052604090208054819061115990613235565b90506000036111a0576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016109c3565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906111dc90869060040161345c565b600060405180830381600087803b1580156111f657600080fd5b505af1925050508015611207575060015b6112a7573d808015611235576040519150601f19603f3d011682016040523d82523d6000602084013e61123a565b606091505b50611247843560016109d3565b508335600090815260046020526040902084906112648282613865565b50506040518435907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906112999084906130c0565b60405180910390a250505050565b6040518335907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25b505050565b6112e1611e89565b60005b818110156112d4578282828181106112fe576112fe613288565b9050602002810190611310919061395f565b6113219060408101906020016139a1565b6113ed576003600084848481811061133b5761133b613288565b905060200281019061134d919061395f565b61135b906020810190612e57565b67ffffffffffffffff1681526020810191909152604001600090812061138091612ce5565b82828281811061139257611392613288565b90506020028101906113a4919061395f565b6113b2906020810190612e57565b67ffffffffffffffff167f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991660405160405180910390a2611662565b8282828181106113ff576113ff613288565b9050602002810190611411919061395f565b61141f9060408101906132f5565b905060000361145a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003600085858581811061147257611472613288565b9050602002810190611484919061395f565b611492906020810190612e57565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090508383838181106114c8576114c8613288565b90506020028101906114da919061395f565b6114e89060408101906132f5565b82916114f59190836135e9565b5083838381811061150857611508613288565b905060200281019061151a919061395f565b6115289060608101906132f5565b1590506115735783838381811061154157611541613288565b9050602002810190611553919061395f565b6115619060608101906132f5565b60018301916115719190836135e9565b505b83838381811061158557611585613288565b9050602002810190611597919061395f565b6115a59060408101906132f5565b6040516115b3929190613225565b60405180910390208484848181106115cd576115cd613288565b90506020028101906115df919061395f565b6115ed906020810190612e57565b67ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721286868681811061162a5761162a613288565b905060200281019061163c919061395f565b61164a9060608101906132f5565b6040516116589291906139be565b60405180910390a3505b6001016112e4565b611672611e89565b73ffffffffffffffffffffffffffffffffffffffff81166116bf576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b61173e611e89565b60085473ffffffffffffffffffffffffffffffffffffffff161561179f5761179f61177e60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff1690600061214f565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935516901561184c5761184c61180c60025473ffffffffffffffffffffffffffffffffffffffff1690565b60085473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6122d1565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b3330146118e3576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118f36040820160208301612e57565b61190060408301836132f5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff86168152600360205260409020805490935061195792509050613235565b159050806119ad5750600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018160405161199891906139d2565b9081526040519081900360200190205460ff16155b156119e657806040517f5075bb380000000000000000000000000000000000000000000000000000000081526004016109c391906130c0565b60006119f560608501856132f5565b810190611a029190613af8565b9050600081604001516001811115611a1c57611a1c612d4c565b03611a2f57611a2a846123cf565b611bf2565b600181604001516001811115611a4757611a47612d4c565b03611bf2576000808260200151806020019051810190611a679190613ba4565b915091506040518060400160405280601581526020017f4d4553534147455f41434b4e4f574c45444745445f0000000000000000000000815250604051602001611ab191906130c0565b6040516020818303038152906040528051906020012082604051602001611ad891906130c0565b6040516020818303038152906040528051906020012014611b25576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526009602052604090205460ff166002811115611b4a57611b4a612d4c565b03611b84576040517f33704b28000000000000000000000000000000000000000000000000000000008152600481018290526024016109c3565b60008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a150505b50505050565b6001611c05600583611e76565b14611c3f576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018290526024016109c3565b611c4a8160006109d3565b506000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611c9290613235565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbe90613235565b8015611d0b5780601f10611ce057610100808354040283529160200191611d0b565b820191906000526020600020905b815481529060010190602001808311611cee57829003601f168201915b50505050508152602001600382018054611d2490613235565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5090613235565b8015611d9d5780601f10611d7257610100808354040283529160200191611d9d565b820191906000526020600020905b815481529060010190602001808311611d8057829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611e205760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611dcb565b50505050815250509050611e3381612745565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611e6a611e89565b611e73816127b7565b50565b6000611e8283836128ac565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109c3565b565b80471015611f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109c3565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611fd0576040519150601f19603f3d011682016040523d82523d6000602084013e611fd5565b606091505b50509050806112d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109c3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112d49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612936565b6000612147848484612a42565b949350505050565b8015806121ef57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ed9190613c25565b155b61227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016109c3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112d49084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120b8565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190613c25565b6123769190613c3e565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611bf29085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016120b8565b604080516000808252602082019092528161240c565b60408051808201909152600080825260208201528152602001906001900390816123e55790505b50905060006040518060a0016040528084806040019061242c91906132f5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080518082018252601581527f4d4553534147455f41434b4e4f574c45444745445f00000000000000000000006020828101919091529151928201926124ad9288359101613c51565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252602082810186905260085473ffffffffffffffffffffffffffffffffffffffff168383015260609092019160039160009161251d918901908901612e57565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101805461254d90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461257990613235565b80156125c65780601f1061259b576101008083540402835291602001916125c6565b820191906000526020600020905b8154815290600101906020018083116125a957829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded6126036040870160208801612e57565b846040518363ffffffff1660e01b8152600401612621929190613c73565b602060405180830381865afa15801561263e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126629190613c25565b60025460085491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561269a57600061269c565b835b6126ac6040890160208a01612e57565b866040518463ffffffff1660e01b81526004016126ca929190613c73565b60206040518083038185885af11580156126e8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061270d9190613c25565b60405190915081908635907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a35050505050565b61274d611e89565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612789908490600401612ffc565b600060405180830381600087803b1580156127a357600080fd5b505af11580156110c9573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109c3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054801515806128d057506128d08484612a5f565b611e82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109c3565b6000612998826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a6b9092919063ffffffff16565b8051909150156112d457808060200190518101906129b69190613d40565b6112d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109c3565b600082815260028401602052604081208290556121478484612a7a565b6000611e828383612a86565b60606121478484600085612a9e565b6000611e828383612bb7565b60008181526001830160205260408120541515611e82565b606082471015612b30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109c3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b5991906139d2565b60006040518083038185875af1925050503d8060008114612b96576040519150601f19603f3d011682016040523d82523d6000602084013e612b9b565b606091505b5091509150612bac87838387612c06565b979650505050505050565b6000818152600183016020526040812054612bfe5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561066e565b50600061066e565b60608315612c9c578251600003612c955773ffffffffffffffffffffffffffffffffffffffff85163b612c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109c3565b5081612147565b6121478383815115612cb15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c391906130c0565b508054612cf190613235565b6000825580601f10612d01575050565b601f016020900490600052602060002090810190611e7391905b80821115612d2f5760008155600101612d1b565b5090565b600060208284031215612d4557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611e7357600080fd5b600080600060408486031215612de757600080fd5b8335612df281612dbc565b9250602084013567ffffffffffffffff80821115612e0f57600080fd5b818601915086601f830112612e2357600080fd5b813581811115612e3257600080fd5b876020828501011115612e4457600080fd5b6020830194508093505050509250925092565b600060208284031215612e6957600080fd5b8135611e8281612dbc565b60005b83811015612e8f578181015183820152602001612e77565b50506000910152565b60008151808452612eb0816020860160208601612e74565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612ef56040830185612e98565b8281036020840152612f078185612e98565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e7357600080fd5b60008060408385031215612f4557600080fd5b8235612f5081612f10565b946020939093013593505050565b600080600060608486031215612f7357600080fd5b8335612f7e81612f10565b92506020840135612f8e81612f10565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612ff1578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612fb4565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a0606084015261303660c0840182612e98565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526130728383612e98565b925060808601519150808584030160a086015250612f078282612f9f565b600080604083850312156130a357600080fd5b8235915060208301356130b581612f10565b809150509250929050565b602081526000611e826020830184612e98565b60008083601f8401126130e557600080fd5b50813567ffffffffffffffff8111156130fd57600080fd5b6020830191508360208260051b850101111561311857600080fd5b9250929050565b6000806000806040858703121561313557600080fd5b843567ffffffffffffffff8082111561314d57600080fd5b613159888389016130d3565b9096509450602087013591508082111561317257600080fd5b5061317f878288016130d3565b95989497509550505050565b60006020828403121561319d57600080fd5b813567ffffffffffffffff8111156131b457600080fd5b820160a08185031215611e8257600080fd5b600080602083850312156131d957600080fd5b823567ffffffffffffffff8111156131f057600080fd5b6131fc858286016130d3565b90969095509350505050565b60006020828403121561321a57600080fd5b8135611e8281612f10565b8183823760009101908152919050565b600181811c9082168061324957607f821691505b602082108103613282577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126132eb57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261332a57600080fd5b83018035915067ffffffffffffffff82111561334557600080fd5b60200191503681900382131561311857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261338f57600080fd5b830160208101925035905067ffffffffffffffff8111156133af57600080fd5b80360382131561311857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612ff157813561342a81612f10565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613417565b60208152813560208201526000602083013561347781612dbc565b67ffffffffffffffff8082166040850152613495604086018661335a565b925060a060608601526134ac60c0860184836133be565b9250506134bc606086018661335a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526134f28583856133be565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261352b57600080fd5b6020928801928301923591508382111561354457600080fd5b8160061b360383131561355657600080fd5b8685030160a0870152612bac848284613407565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f8211156112d4576000816000526020600020601f850160051c810160208610156135c25750805b601f850160051c820191505b818110156135e1578281556001016135ce565b505050505050565b67ffffffffffffffff8311156136015761360161356a565b6136158361360f8354613235565b83613599565b6000601f84116001811461366757600085156136315750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556110c9565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156136b65786850135825560209485019460019092019101613696565b50868210156136f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561373d81612f10565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156137a3576137a361356a565b8054838255808410156138305760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146137e4576137e4613703565b80861686146137f5576137f5613703565b5060008360005260206000208360011b81018760011b820191505b8082101561382b578282558284830155600282019150613810565b505050505b5060008181526020812083915b858110156135e15761384f8383613732565b604092909201916002919091019060010161383d565b8135815560018101602083013561387b81612dbc565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556138bb60408601866132f5565b935091506138cd8383600287016135e9565b6138da60608601866132f5565b935091506138ec8383600387016135e9565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261392357600080fd5b91840191823591508082111561393857600080fd5b506020820191508060061b360382131561395157600080fd5b611bf281836004860161378a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126132eb57600080fd5b8015158114611e7357600080fd5b6000602082840312156139b357600080fd5b8135611e8281613993565b6020815260006121476020830184866133be565b600082516132eb818460208701612e74565b6040516060810167ffffffffffffffff81118282101715613a0757613a0761356a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5457613a5461356a565b604052919050565b600067ffffffffffffffff821115613a7657613a7661356a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ab357600080fd5b8135613ac6613ac182613a5c565b613a0d565b818152846020838601011115613adb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613b0a57600080fd5b813567ffffffffffffffff80821115613b2257600080fd5b9083019060608286031215613b3657600080fd5b613b3e6139e4565b823582811115613b4d57600080fd5b613b5987828601613aa2565b825250602083013582811115613b6e57600080fd5b613b7a87828601613aa2565b6020830152506040830135925060028310613b9457600080fd5b6040810192909252509392505050565b60008060408385031215613bb757600080fd5b825167ffffffffffffffff811115613bce57600080fd5b8301601f81018513613bdf57600080fd5b8051613bed613ac182613a5c565b818152866020838501011115613c0257600080fd5b613c13826020830160208601612e74565b60209590950151949694955050505050565b600060208284031215613c3757600080fd5b5051919050565b8082018082111561066e5761066e613703565b604081526000613c646040830185612e98565b90508260208301529392505050565b67ffffffffffffffff83168152604060208201526000825160a06040840152613c9f60e0840182612e98565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613cdb8383612e98565b92506040860151915080858403016080860152613cf88383612f9f565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613d368282612e98565b9695505050505050565b600060208284031215613d5257600080fd5b8151611e828161399356fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidAckMessageHeader\",\"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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":\"messageId\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ACK_MESSAGE_HEADER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"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\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"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: "0x60806040523480156200001157600080fd5b506040516200422d3803806200422d833981016040819052620000349162000565565b818033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000141565b5050506001600160a01b038116620000eb576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492851692909116821790551590506200013957620001396001600160a01b03821683600019620001ec565b50506200068a565b336001600160a01b038216036200019b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200023e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002649190620005a4565b620002709190620005be565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620002cc91869190620002d216565b50505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000321906001600160a01b038516908490620003a8565b805190915015620003a35780806020019051810190620003429190620005e6565b620003a35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b505050565b6060620003b98484600085620003c1565b949350505050565b606082471015620004245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b0316858760405162000442919062000637565b60006040518083038185875af1925050503d806000811462000481576040519150601f19603f3d011682016040523d82523d6000602084013e62000486565b606091505b5090925090506200049a87838387620004a5565b979650505050505050565b606083156200051957825160000362000511576001600160a01b0385163b620005115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b5081620003b9565b620003b98383815115620005305781518083602001fd5b8060405162461bcd60e51b815260040162000084919062000655565b6001600160a01b03811681146200056257600080fd5b50565b600080604083850312156200057957600080fd5b825162000586816200054c565b602084015190925062000599816200054c565b809150509250929050565b600060208284031215620005b757600080fd5b5051919050565b80820180821115620005e057634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215620005f957600080fd5b815180151581146200060a57600080fd5b9392505050565b60005b838110156200062e57818101518382015260200162000614565b50506000910152565b600082516200064b81846020870162000611565b9190910192915050565b60208152600082518060208401526200067681604085016020870162000611565b601f01601f19169190910160400192915050565b613b93806200069a6000396000f3fe6080604052600436106101635760003560e01c806385572ffb116100c0578063c89245d511610074578063cf6730f811610059578063cf6730f81461043b578063e4ca87541461045b578063f2fde38b1461047b57600080fd5b8063c89245d5146103f0578063ca709a251461041057600080fd5b80639fe74e26116100a55780639fe74e2614610385578063b0f479a1146103a5578063c851cc32146103d057600080fd5b806385572ffb146103195780638da5cb5b1461033957600080fd5b80636939cd97116101175780636fef519e116100fc5780636fef519e146102a257806379ba5097146102e45780638462a2b9146102f957600080fd5b80636939cd97146102555780636d62d6331461028257600080fd5b80630e958d6b116101485780630e958d6b146101e557806335f170ef146102055780635e35359e1461023357600080fd5b806305bfe9821461016f5780630a9094dc146101b557600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b5061019f61018a366004612a6b565b60086020526000908152604090205460ff1681565b6040516101ac9190612ab3565b60405180910390f35b3480156101c157600080fd5b506101d56101d0366004612a6b565b61049b565b60405190151581526020016101ac565b3480156101f157600080fd5b506101d5610200366004612b0a565b6104ae565b34801561021157600080fd5b50610225610220366004612b8f565b6104f9565b6040516101ac929190612c1a565b34801561023f57600080fd5b5061025361024e366004612c6a565b610625565b005b34801561026157600080fd5b50610275610270366004612a6b565b6106fa565b6040516101ac9190612d08565b34801561028e57600080fd5b5061025361029d366004612d9c565b610905565b3480156102ae57600080fd5b506102d67f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b281565b6040519081526020016101ac565b3480156102f057600080fd5b50610253610b1d565b34801561030557600080fd5b50610253610314366004612e18565b610c1a565b34801561032557600080fd5b50610253610334366004612e84565b610f5b565b34801561034557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ac565b34801561039157600080fd5b506102536103a0366004612ebf565b611152565b3480156103b157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610360565b3480156103dc57600080fd5b506102536103eb366004612f01565b61130b565b3480156103fc57600080fd5b5061025361040b366004612f01565b6113d7565b34801561041c57600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff16610360565b34801561044757600080fd5b50610253610456366004612e84565b61154b565b34801561046757600080fd5b50610253610476366004612a6b565b611839565b34801561048757600080fd5b50610253610496366004612f01565b611b07565b60006104a8600583611b1b565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906104dd9085908590612f1e565b9081526040519081900360200190205460ff1690509392505050565b60036020526000908152604090208054819061051490612f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461054090612f2e565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050908060010180546105a290612f2e565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce90612f2e565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b5050505050905082565b61062d611b36565b73ffffffffffffffffffffffffffffffffffffffff831661066d5761066873ffffffffffffffffffffffffffffffffffffffff831682611bb9565b61068e565b61068e73ffffffffffffffffffffffffffffffffffffffff84168383611d13565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516106ed91815260200190565b60405180910390a3505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff169183019190915260028101805493949293919284019161076990612f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461079590612f2e565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b505050505081526020016003820180546107fb90612f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461082790612f2e565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156108f75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016108a2565b505050915250909392505050565b61090d611b36565b610918600583611b1b565b610956576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b828210156109d75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610982565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610a2760028301826129b9565b610a356003830160006129b9565b610a436004830160006129f3565b50610a519050600584611de7565b5060005b8151811015610acb57610ac383838381518110610a7457610a74612f81565b602002602001015160200151848481518110610a9257610a92612f81565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16611d139092919063ffffffff16565b600101610a55565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094d565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610c22611b36565b60005b81811015610db55760036000848484818110610c4357610c43612f81565b9050602002810190610c559190612fb0565b610c63906020810190612b8f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201838383818110610c9a57610c9a612f81565b9050602002810190610cac9190612fb0565b610cba906020810190612fee565b604051610cc8929190612f1e565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055828282818110610d0f57610d0f612f81565b9050602002810190610d219190612fb0565b610d2f906020810190612fee565b604051610d3d929190612f1e565b6040518091039020838383818110610d5757610d57612f81565b9050602002810190610d699190612fb0565b610d77906020810190612b8f565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101610c25565b5060005b83811015610f5457600160036000878785818110610dd957610dd9612f81565b9050602002810190610deb9190612fb0565b610df9906020810190612b8f565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600201868684818110610e3057610e30612f81565b9050602002810190610e429190612fb0565b610e50906020810190612fee565b604051610e5e929190612f1e565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055848482818110610eae57610eae612f81565b9050602002810190610ec09190612fb0565b610ece906020810190612fee565b604051610edc929190612f1e565b6040518091039020858583818110610ef657610ef6612f81565b9050602002810190610f089190612fb0565b610f16906020810190612b8f565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101610db9565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610fae576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161094d565b610fbe6040820160208301612b8f565b67ffffffffffffffff811660009081526003602052604090208054610fe290612f2e565b9050600003611029576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161094d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611065908590600401613155565b600060405180830381600087803b15801561107f57600080fd5b505af1925050508015611090575060015b611122573d8080156110be576040519150601f19603f3d011682016040523d82523d6000602084013e6110c3565b606091505b506110d060058435611df3565b508235600090815260046020526040902083906110ed828261355e565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f90610b10908490613658565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b61115a611b36565b60005b8181101561130657600083838381811061117957611179612f81565b905060200281019061118b919061366b565b61119490613781565b905080602001516111ff57805167ffffffffffffffff1660009081526003602052604081206111c2916129b9565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26112fd565b80604001515160000361123e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906112699082613832565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906112979082613832565b5080604001516040516112aa919061394c565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516112f49190613658565b60405180910390a35b5060010161115d565b505050565b611313611b36565b73ffffffffffffffffffffffffffffffffffffffff8116611360576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b6113df611b36565b60075473ffffffffffffffffffffffffffffffffffffffff16156114405761144061141f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000611dff565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093551690156114ed576114ed6114ad60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611f81565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e6760405160405180910390a35050565b333014611584576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115946040820160208301612b8f565b6115a16040830183612fee565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff8616815260036020526040902080549093506115f892509050612f2e565b1590508061164e5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611639919061394c565b9081526040519081900360200190205460ff16155b1561168757806040517f5075bb3800000000000000000000000000000000000000000000000000000000815260040161094d9190613658565b60006116966060850185612fee565b8101906116a3919061395e565b90506000816040015160018111156116bd576116bd612a84565b036116d1576116cb8461207f565b50505050565b6001816040015160018111156116e9576116e9612a84565b036116cb5760008082602001518060200190518101906117099190613a0a565b90925090507f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b28214611767576040517fae15168d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008281526008602052604090205460ff16600281111561178c5761178c612a84565b036117c6576040517f33704b280000000000000000000000000000000000000000000000000000000081526004810182905260240161094d565b60008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905590518281527fef0cb160d3dc564cde61ae97d9981f9c4d92ace727a2ec202b18b223ea832a79910160405180910390a1505050505050565b611844600582611b1b565b61187d576040517fb6e782600000000000000000000000000000000000000000000000000000000081526004810182905260240161094d565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916118c490612f2e565b80601f01602080910402602001604051908101604052809291908181526020018280546118f090612f2e565b801561193d5780601f106119125761010080835404028352916020019161193d565b820191906000526020600020905b81548152906001019060200180831161192057829003601f168201915b5050505050815260200160038201805461195690612f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461198290612f2e565b80156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611a525760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff1682526001908101548284015290835290920191016119fd565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169055919250611aa460028301826129b9565b611ab26003830160006129b9565b611ac06004830160006129f3565b50611ace9050600583611de7565b50611ad8816123f5565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b611b0f611b36565b611b1881612467565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094d565b565b80471015611c23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611c7d576040519150601f19603f3d011682016040523d82523d6000602084013e611c82565b606091505b5050905080611306576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113069084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261255c565b6000611b2f8383612668565b6000611b2f838361275b565b801580611e9f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d9190613a2e565b155b611f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161094d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113069084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611d65565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190613a2e565b6120269190613a47565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506116cb9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611d65565b60006040518060a0016040528083806040019061209c9190612fee565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604051602091820191612114917f1c778f21871bcc06cfebd177c4d0360c2f3550962fb071f69ed007e4f55f23b29187359101918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561218e57816020015b60408051808201909152600080825260208201528152602001906001900390816121675790505b50815260075473ffffffffffffffffffffffffffffffffffffffff166020808301919091526040918201916003916000916121ce91908801908801612b8f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546121fe90612f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461222a90612f2e565b80156122775780601f1061224c57610100808354040283529160200191612277565b820191906000526020600020905b81548152906001019060200180831161225a57829003601f168201915b50505091909252505060025490915060009073ffffffffffffffffffffffffffffffffffffffff166320487ded6122b46040860160208701612b8f565b846040518363ffffffff1660e01b81526004016122d2929190613a5a565b602060405180830381865afa1580156122ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123139190613a2e565b60025460075491925060009173ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f991161561234b57600061234d565b835b61235d6040880160208901612b8f565b866040518463ffffffff1660e01b815260040161237b929190613a5a565b60206040518083038185885af1158015612399573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123be9190613a2e565b60405190915081908535907f9102b9031c3c59d8320bf14d84d7d7a3434366b91032fad1c87579cfc62b237290600090a350505050565b6123fd611b36565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612439908490600401612d08565b600060405180830381600087803b15801561245357600080fd5b505af1158015610f54573d6000803e3d6000fd5b3373ffffffffffffffffffffffffffffffffffffffff8216036124e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006125be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127aa9092919063ffffffff16565b80519091501561130657808060200190518101906125dc9190613b27565b611306576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161094d565b6000818152600183016020526040812054801561275157600061268c600183613b44565b85549091506000906126a090600190613b44565b90508181146127055760008660000182815481106126c0576126c0612f81565b90600052602060002001549050808760000184815481106126e3576126e3612f81565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061271657612716613b57565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a8565b60009150506104a8565b60008181526001830160205260408120546127a2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a8565b5060006104a8565b60606127b984846000856127c1565b949350505050565b606082471015612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161094d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161287c919061394c565b60006040518083038185875af1925050503d80600081146128b9576040519150601f19603f3d011682016040523d82523d6000602084013e6128be565b606091505b50915091506128cf878383876128da565b979650505050505050565b606083156129705782516000036129695773ffffffffffffffffffffffffffffffffffffffff85163b612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161094d565b50816127b9565b6127b983838151156129855781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d9190613658565b5080546129c590612f2e565b6000825580601f106129d5575050565b601f016020900490600052602060002090810190611b189190612a14565b5080546000825560020290600052602060002090810190611b189190612a2d565b5b80821115612a295760008155600101612a15565b5090565b5b80821115612a295780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201612a2e565b600060208284031215612a7d57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310612aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114611b1857600080fd5b600080600060408486031215612b1f57600080fd5b8335612b2a81612af4565b9250602084013567ffffffffffffffff80821115612b4757600080fd5b818601915086601f830112612b5b57600080fd5b813581811115612b6a57600080fd5b876020828501011115612b7c57600080fd5b6020830194508093505050509250925092565b600060208284031215612ba157600080fd5b8135611b2f81612af4565b60005b83811015612bc7578181015183820152602001612baf565b50506000910152565b60008151808452612be8816020860160208601612bac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000612c2d6040830185612bd0565b8281036020840152612c3f8185612bd0565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b1857600080fd5b600080600060608486031215612c7f57600080fd5b8335612c8a81612c48565b92506020840135612c9a81612c48565b929592945050506040919091013590565b60008151808452602080850194506020840160005b83811015612cfd578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101612cc0565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152612d4260c0840182612bd0565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152612d7e8383612bd0565b925060808601519150808584030160a086015250612c3f8282612cab565b60008060408385031215612daf57600080fd5b823591506020830135612dc181612c48565b809150509250929050565b60008083601f840112612dde57600080fd5b50813567ffffffffffffffff811115612df657600080fd5b6020830191508360208260051b8501011115612e1157600080fd5b9250929050565b60008060008060408587031215612e2e57600080fd5b843567ffffffffffffffff80821115612e4657600080fd5b612e5288838901612dcc565b90965094506020870135915080821115612e6b57600080fd5b50612e7887828801612dcc565b95989497509550505050565b600060208284031215612e9657600080fd5b813567ffffffffffffffff811115612ead57600080fd5b820160a08185031215611b2f57600080fd5b60008060208385031215612ed257600080fd5b823567ffffffffffffffff811115612ee957600080fd5b612ef585828601612dcc565b90969095509350505050565b600060208284031215612f1357600080fd5b8135611b2f81612c48565b8183823760009101908152919050565b600181811c90821680612f4257607f821691505b602082108103612f7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112612fe457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261302357600080fd5b83018035915067ffffffffffffffff82111561303e57600080fd5b602001915036819003821315612e1157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261308857600080fd5b830160208101925035905067ffffffffffffffff8111156130a857600080fd5b803603821315612e1157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612cfd57813561312381612c48565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613110565b60208152813560208201526000602083013561317081612af4565b67ffffffffffffffff808216604085015261318e6040860186613053565b925060a060608601526131a560c0860184836130b7565b9250506131b56060860186613053565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526131eb8583856130b7565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261322457600080fd5b6020928801928301923591508382111561323d57600080fd5b8160061b360383131561324f57600080fd5b8685030160a08701526128cf848284613100565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115611306576000816000526020600020601f850160051c810160208610156132bb5750805b601f850160051c820191505b818110156132da578281556001016132c7565b505050505050565b67ffffffffffffffff8311156132fa576132fa613263565b61330e836133088354612f2e565b83613292565b6000601f841160018114613360576000851561332a5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610f54565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156133af578685013582556020948501946001909201910161338f565b50868210156133ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561343681612c48565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561349c5761349c613263565b8054838255808410156135295760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146134dd576134dd6133fc565b80861686146134ee576134ee6133fc565b5060008360005260206000208360011b81018760011b820191505b80821015613524578282558284830155600282019150613509565b505050505b5060008181526020812083915b858110156132da57613548838361342b565b6040929092019160029190910190600101613536565b8135815560018101602083013561357481612af4565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556135b46040860186612fee565b935091506135c68383600287016132e2565b6135d36060860186612fee565b935091506135e58383600387016132e2565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261361c57600080fd5b91840191823591508082111561363157600080fd5b506020820191508060061b360382131561364a57600080fd5b6116cb818360048601613483565b602081526000611b2f6020830184612bd0565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612fe457600080fd5b6040516060810167ffffffffffffffff811182821017156136c2576136c2613263565b60405290565b8015158114611b1857600080fd5b600082601f8301126136e757600080fd5b813567ffffffffffffffff8082111561370257613702613263565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561374857613748613263565b8160405283815286602085880101111561376157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006080823603121561379357600080fd5b6040516080810167ffffffffffffffff82821081831117156137b7576137b7613263565b81604052843591506137c882612af4565b9082526020840135906137da826136c8565b81602084015260408501359150808211156137f457600080fd5b613800368387016136d6565b6040840152606085013591508082111561381957600080fd5b50613826368286016136d6565b60608301525092915050565b815167ffffffffffffffff81111561384c5761384c613263565b6138608161385a8454612f2e565b84613292565b602080601f8311600181146138b3576000841561387d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132da565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613900578886015182559484019460019091019084016138e1565b508582101561393c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60008251612fe4818460208701612bac565b60006020828403121561397057600080fd5b813567ffffffffffffffff8082111561398857600080fd5b908301906060828603121561399c57600080fd5b6139a461369f565b8235828111156139b357600080fd5b6139bf878286016136d6565b8252506020830135828111156139d457600080fd5b6139e0878286016136d6565b60208301525060408301359250600283106139fa57600080fd5b6040810192909252509392505050565b60008060408385031215613a1d57600080fd5b505080516020909101519092909150565b600060208284031215613a4057600080fd5b5051919050565b808201808211156104a8576104a86133fc565b67ffffffffffffffff83168152604060208201526000825160a06040840152613a8660e0840182612bd0565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080858403016060860152613ac28383612bd0565b92506040860151915080858403016080860152613adf8383612cab565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c086015250613b1d8282612bd0565b9695505050505050565b600060208284031215613b3957600080fd5b8151611b2f816136c8565b818103818111156104a8576104a86133fc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var CCIPReceiverWithACKABI = CCIPReceiverWithACKMetaData.ABI @@ -196,70 +196,70 @@ func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorRaw) Transact(opts *bin return _CCIPReceiverWithACK.Contract.contract.Transact(opts, method, params...) } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) ACKMESSAGEHEADER(opts *bind.CallOpts) ([32]byte, error) { var out []interface{} err := _CCIPReceiverWithACK.contract.Call(opts, &out, "ACK_MESSAGE_HEADER") if err != nil { - return *new(string), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(string)).(*string) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) ACKMESSAGEHEADER() (string, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) ACKMESSAGEHEADER() ([32]byte, error) { return _CCIPReceiverWithACK.Contract.ACKMESSAGEHEADER(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) ACKMESSAGEHEADER() (string, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) ACKMESSAGEHEADER() ([32]byte, error) { return _CCIPReceiverWithACK.Contract.ACKMESSAGEHEADER(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getMessageContents", messageId) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getFeeToken") if err != nil { - return *new(ClientAny2EVMMessage), err + return *new(common.Address), err } - out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { - return _CCIPReceiverWithACK.Contract.GetMessageContents(&_CCIPReceiverWithACK.CallOpts, messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) GetFeeToken() (common.Address, error) { + return _CCIPReceiverWithACK.Contract.GetFeeToken(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { - return _CCIPReceiverWithACK.Contract.GetMessageContents(&_CCIPReceiverWithACK.CallOpts, messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) GetFeeToken() (common.Address, error) { + return _CCIPReceiverWithACK.Contract.GetFeeToken(&_CCIPReceiverWithACK.CallOpts) } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) { +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { var out []interface{} - err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getMessageStatus", messageId) + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "getMessageContents", messageId) if err != nil { - return *new(*big.Int), err + return *new(ClientAny2EVMMessage), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new(ClientAny2EVMMessage)).(*ClientAny2EVMMessage) return out0, err } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _CCIPReceiverWithACK.Contract.GetMessageStatus(&_CCIPReceiverWithACK.CallOpts, messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPReceiverWithACK.Contract.GetMessageContents(&_CCIPReceiverWithACK.CallOpts, messageId) } -func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) GetMessageStatus(messageId [32]byte) (*big.Int, error) { - return _CCIPReceiverWithACK.Contract.GetMessageStatus(&_CCIPReceiverWithACK.CallOpts, messageId) +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) GetMessageContents(messageId [32]byte) (ClientAny2EVMMessage, error) { + return _CCIPReceiverWithACK.Contract.GetMessageContents(&_CCIPReceiverWithACK.CallOpts, messageId) } func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { @@ -306,6 +306,28 @@ func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) IsApprovedSender(s return _CCIPReceiverWithACK.Contract.IsApprovedSender(&_CCIPReceiverWithACK.CallOpts, sourceChainSelector, senderAddr) } +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) { + var out []interface{} + err := _CCIPReceiverWithACK.contract.Call(opts, &out, "isFailedMessage", messageId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPReceiverWithACK *CCIPReceiverWithACKSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPReceiverWithACK.Contract.IsFailedMessage(&_CCIPReceiverWithACK.CallOpts, messageId) +} + +func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) IsFailedMessage(messageId [32]byte) (bool, error) { + return _CCIPReceiverWithACK.Contract.IsFailedMessage(&_CCIPReceiverWithACK.CallOpts, messageId) +} + func (_CCIPReceiverWithACK *CCIPReceiverWithACKCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _CCIPReceiverWithACK.contract.Call(opts, &out, "owner") @@ -358,28 +380,6 @@ func (_CCIPReceiverWithACK *CCIPReceiverWithACKCallerSession) SChainConfigs(dest return _CCIPReceiverWithACK.Contract.SChainConfigs(&_CCIPReceiverWithACK.CallOpts, destChainSelector) } -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) @@ -522,18 +522,6 @@ func (_CCIPReceiverWithACK *CCIPReceiverWithACKTransactorSession) UpdateRouter(n return _CCIPReceiverWithACK.Contract.UpdateRouter(&_CCIPReceiverWithACK.TransactOpts, newRouter) } -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) } @@ -2769,24 +2757,24 @@ func (_CCIPReceiverWithACK *CCIPReceiverWithACK) Address() common.Address { } type CCIPReceiverWithACKInterface interface { - ACKMESSAGEHEADER(opts *bind.CallOpts) (string, error) + ACKMESSAGEHEADER(opts *bind.CallOpts) ([32]byte, error) - GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + GetFeeToken(opts *bind.CallOpts) (common.Address, error) - GetMessageStatus(opts *bind.CallOpts, messageId [32]byte) (*big.Int, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) GetRouter(opts *bind.CallOpts) (common.Address, error) IsApprovedSender(opts *bind.CallOpts, sourceChainSelector uint64, senderAddr []byte) (bool, error) + IsFailedMessage(opts *bind.CallOpts, messageId [32]byte) (bool, error) + Owner(opts *bind.CallOpts) (common.Address, error) SChainConfigs(opts *bind.CallOpts, destChainSelector uint64) (SChainConfigs, error) - SFeeToken(opts *bind.CallOpts) (common.Address, error) - SMessageStatus(opts *bind.CallOpts, messageId [32]byte) (uint8, error) AbandonFailedMessage(opts *bind.TransactOpts, messageId [32]byte, receiver common.Address) (*types.Transaction, error) @@ -2809,8 +2797,6 @@ type CCIPReceiverWithACKInterface interface { UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*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) Receive(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go index 3204871921..4dc7e05eec 100644 --- a/core/gethwrappers/ccip/generated/offramp/offramp.go +++ b/core/gethwrappers/ccip/generated/offramp/offramp.go @@ -163,7 +163,7 @@ type OffRampStaticConfig struct { var OffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNV2.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SkippedReportExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162006c9638038062006c968339810160408190526200003591620008c7565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003c1565b50505062000c67565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b031916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b60005b815181101562000666576000828281518110620003e557620003e562000a1d565b60200260200101519050600081602001519050806001600160401b0316600003620004235760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166200044c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291620004789062000a33565b80601f0160208091040260200160405190810160405280929190818152602001828054620004a69062000a33565b8015620004f75780601f10620004cb57610100808354040283529160200191620004f7565b820191906000526020600020905b815481529060010190602001808311620004d957829003601f168201915b5050505050905060008460600151905081516000036200059e57805160000362000534576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000544828262000ac4565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005d9565b8080519060200120828051906020012014620005d95760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906200064d90869062000b90565b60405180910390a25050505050806001019050620003c4565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620006a557620006a56200066a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006d657620006d66200066a565b604052919050565b80516001600160401b0381168114620006f657600080fd5b919050565b6001600160a01b03811681146200071157600080fd5b50565b805163ffffffff81168114620006f657600080fd5b6000601f83601f8401126200073d57600080fd5b825160206001600160401b03808311156200075c576200075c6200066a565b8260051b6200076d838201620006ab565b93845286810183019383810190898611156200078857600080fd5b84890192505b85831015620008ba57825184811115620007a85760008081fd5b89016080601f19828d038101821315620007c25760008081fd5b620007cc62000680565b88840151620007db81620006fb565b81526040620007ec858201620006de565b8a8301526060808601518015158114620008065760008081fd5b838301529385015193898511156200081e5760008081fd5b84860195508f603f8701126200083657600094508485fd5b8a8601519450898511156200084f576200084f6200066a565b620008608b858f88011601620006ab565b93508484528f82868801011115620008785760008081fd5b60005b8581101562000898578681018301518582018d01528b016200087b565b5060009484018b0194909452509182015283525091840191908401906200078e565b9998505050505050505050565b6000806000838503610140811215620008df57600080fd5b6080811215620008ee57600080fd5b620008f862000680565b6200090386620006de565b815260208601516200091581620006fb565b602082015260408601516200092a81620006fb565b604082015260608601516200093f81620006fb565b6060820152935060a0607f19820112156200095957600080fd5b5060405160a081016001600160401b0380821183831017156200098057620009806200066a565b81604052608087015191506200099682620006fb565b818352620009a760a0880162000714565b6020840152620009ba60c0880162000714565b6040840152620009cd60e0880162000714565b60608401526101008701519150620009e582620006fb565b608083018290526101208701519294508083111562000a0357600080fd5b505062000a138682870162000729565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4857607f821691505b60208210810362000a6957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000abf576000816000526020600020601f850160051c8101602086101562000a9a5750805b601f850160051c820191505b8181101562000abb5782815560010162000aa6565b5050505b505050565b81516001600160401b0381111562000ae05762000ae06200066a565b62000af88162000af1845462000a33565b8462000a6f565b602080601f83116001811462000b30576000841562000b175750858301515b600019600386901b1c1916600185901b17855562000abb565b600085815260208120601f198616915b8281101562000b615788860151825594840194600190910190840162000b40565b508582101562000b805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000be58162000a33565b8060a089015260c0600183166000811462000c09576001811462000c265762000c58565b60ff19841660c08b015260c083151560051b8b0101945062000c58565b85600052602060002060005b8481101562000c4f5781548c820185015290880190890162000c32565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615fb962000cdd600039600081816102400152612a8a0152600081816102110152612f7e0152600081816101e20152818161077f01528181610986015261240c0152600081816101b201526126990152600081816117dd01526118290152615fb96000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e1461052a578063f2fde38b1461054a578063f716f99f1461055d57600080fd5b8063c673e584146104c5578063ccd37ba3146104e557600080fd5b80638da5cb5b116100b25780638da5cb5b14610484578063991a50181461049f578063a80036b4146104b257600080fd5b806379ba50971461046e57806385572ffb1461047657600080fd5b80632d04ab76116101245780633f4b04aa116101095780633f4b04aa146103365780635e36480c146103525780637437ff9f1461037257600080fd5b80632d04ab7614610310578063311cd5131461032357600080fd5b806304666f9c1461015657806305d938b51461016b57806306285c691461017e578063181f5a77146102c7575b600080fd5b6101696101643660046140f6565b610570565b005b610169610179366004614780565b610584565b61027060408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102be9190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103036040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102be91906148fb565b61016961031e3660046149a6565b610729565b610169610331366004614a59565b610cc1565b60095460405167ffffffffffffffff90911681526020016102be565b610365610360366004614aad565b610d2a565b6040516102be9190614b0a565b6104116040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526004546001600160a01b03808216835263ffffffff600160a01b83048116602085015278010000000000000000000000000000000000000000000000008304811694840194909452600160e01b9091049092166060820152600554909116608082015290565b6040516102be9190600060a0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b610169610d80565b610169610151366004614b18565b6000546040516001600160a01b0390911681526020016102be565b6101696104ad366004614b67565b610e3e565b6101696104c0366004614bdb565b610e4f565b6104d86104d3366004614c48565b6111c2565b6040516102be9190614ca8565b61051c6104f3366004614d1d565b67ffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102be565b61053d610538366004614d47565b611320565b6040516102be9190614d62565b610169610558366004614db0565b61142d565b61016961056b366004614e35565b61143e565b610578611480565b610581816114dc565b50565b61058c6117da565b8151815181146105c8576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156107195760008482815181106105e7576105e7614f73565b6020026020010151905060008160200151519050600085848151811061060f5761060f614f73565b6020026020010151905080518214610653576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8281101561070a57600082828151811061067257610672614f73565b6020026020010151905080600014610701578460200151828151811061069a5761069a614f73565b6020026020010151608001518110156107015784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064015b60405180910390fd5b50600101610656565b505050508060010190506105cb565b50610724838361185b565b505050565b6000610737878901896151a5565b602081015151909150156107e357602081015160408083015190517f30dfc3080000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926330dfc308926107b292600401615409565b60006040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050505b805151511515806107f957508051602001515115155b156108f95760095460208a01359067ffffffffffffffff808316911610156108b8576009805467ffffffffffffffff191667ffffffffffffffff83161790556004805483516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921692633937306f926108819291016154eb565b600060405180830381600087803b15801561089b57600080fd5b505af11580156108af573d6000803e3d6000fd5b505050506108f7565b8160200151516000036108f7576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b816020015151811015610c0a5760008260200151828151811061092157610921614f73565b602090810291909101015180516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f191906154fe565b15610a34576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106f8565b6000610a3f8261190b565b6020840151815491925067ffffffffffffffff908116600160a81b90920416141580610a865750826040015167ffffffffffffffff16836020015167ffffffffffffffff16115b15610ae7578251602084015160408086015190517fd5e0f0d600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff938416600482015291831660248301529190911660448201526064016106f8565b606083015180610b23576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff16600090815260086020908152604080832084845290915290205415610b965783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018290526044016106f8565b6040840151610ba6906001615531565b82547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b67ffffffffffffffff9283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016108fc565b507fd7868a16facbdde7b5c020620136316b3c266fffcb4e1e41cb6a662fe14ba3e181604051610c3a9190615559565b60405180910390a1610cb660008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611972915050565b505050505050505050565b610d01610cd0828401846155b1565b6040805160008082526020820190925290610cfb565b6060815260200190600190039081610ce65790505b5061185b565b604080516000808252602082019092529050610d24600185858585866000611972565b50505050565b6000610d38600160046155e6565b6002610d4560808561560f565b67ffffffffffffffff16610d599190615636565b610d638585611ce9565b901c166003811115610d7757610d77614ae0565b90505b92915050565b6001546001600160a01b03163314610dda5760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106f8565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e46611480565b61058181611d30565b333014610e88576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610ec5565b6040805180820190915260008082526020820152815260200190600190039081610e9e5790505b5060a08501515190915015610ef957610ef68460a00151856020015186606001518760000151602001518787611e96565b90505b6040805160a0810182528551518152855160209081015167ffffffffffffffff1681830152808701518351600094840192610f359291016148fb565b60408051601f19818403018152918152908252878101516020830152018390526005549091506001600160a01b03168015611042576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a190610faf9085906004016156ef565b600060405180830381600087803b158015610fc957600080fd5b505af1925050508015610fda575060015b611042573d808015611008576040519150601f19603f3d011682016040523d82523d6000602084013e61100d565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016106f891906148fb565b60408601515115801561105757506080860151155b8061106e575060608601516001600160a01b03163b155b806110ae575060608601516110ac906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000611fb5565b155b156110bb57505050505050565b855160209081015167ffffffffffffffff1660009081526006909152604080822054608089015160608a015192517f3cf9798300000000000000000000000000000000000000000000000000000000815284936001600160a01b0390931692633cf97983926111339289926113889291600401615702565b6000604051808303816000875af1158015611152573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261117a919081019061573e565b5091509150816111b857806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106f891906148fb565b5050505050505050565b6112056040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156112ae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611290575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561131057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112f2575b5050505050815250509050919050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916113ad906157d4565b80601f01602080910402602001604051908101604052809291908181526020018280546113d9906157d4565b80156113105780601f106113fb57610100808354040283529160200191611310565b820191906000526020600020905b81548152906001019060200180831161140957505050919092525091949350505050565b611435611480565b61058181611fd1565b611446611480565b60005b815181101561147c5761147482828151811061146757611467614f73565b6020026020010151612087565b600101611449565b5050565b6000546001600160a01b031633146114da5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106f8565b565b60005b815181101561147c5760008282815181106114fc576114fc614f73565b602002602001015190506000816020015190508067ffffffffffffffff16600003611553576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81516001600160a01b031661157b576040516342bcdf7f60e11b815260040160405180910390fd5b67ffffffffffffffff811660009081526006602052604081206001810180549192916115a6906157d4565b80601f01602080910402602001604051908101604052809291908181526020018280546115d2906157d4565b801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b5050505050905060008460600151905081516000036116d757805160000361165a576040516342bcdf7f60e11b815260040160405180910390fd5b60018301611668828261585e565b5082547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b17835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a161172a565b808051906020012082805190602001201461172a576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106f8565b604080860151845487516001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19921515600160a01b02929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171784555167ffffffffffffffff8516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906117c290869061591e565b60405180910390a250505050508060010190506114df565b467f0000000000000000000000000000000000000000000000000000000000000000146114da576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106f8565b8151600003611895576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611904576118fc8582815181106118ca576118ca614f73565b6020026020010151846118f6578583815181106118e9576118e9614f73565b60200260200101516123b8565b836123b8565b6001016118ac565b5050505050565b67ffffffffffffffff811660009081526006602052604081208054600160a01b900460ff16610d7a576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016106f8565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906119d18760a46159ec565b9050826060015115611a195784516119ea906020615636565b86516119f7906020615636565b611a029060a06159ec565b611a0c91906159ec565b611a1690826159ec565b90505b368114611a5b576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106f8565b5081518114611aa35781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016106f8565b611aab6117da565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611af957611af9614ae0565b6002811115611b0a57611b0a614ae0565b9052509050600281602001516002811115611b2757611b27614ae0565b148015611b7b5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611b6357611b63614f73565b6000918252602090912001546001600160a01b031633145b611bb1576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611c93576020820151611bcc9060016159ff565b60ff16855114611c08576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611c43576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611c55929190615a18565b604051908190038120611c6c918b90602001615a28565b604051602081830303815290604052805190602001209050611c918a82888888612d38565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b67ffffffffffffffff8216600090815260076020526040812081611d0e608085615a3c565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b80516001600160a01b0316611d58576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a17600160a01b63ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff1916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b6060865167ffffffffffffffff811115611eb257611eb2613f0d565b604051908082528060200260200182016040528015611ef757816020015b6040805180820190915260008082526020820152815260200190600190039081611ed05790505b50905060005b8751811015611fa957611f84888281518110611f1b57611f1b614f73565b6020026020010151888888888887818110611f3857611f38614f73565b9050602002810190611f4a9190615a63565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f1d92505050565b828281518110611f9657611f96614f73565b6020908102919091010152600101611efd565b505b9695505050505050565b6000611fc0836132c2565b8015610d775750610d778383613326565b336001600160a01b038216036120295760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106f8565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff166000036120b2576000604051631b3fab5160e11b81526004016106f89190615aaa565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361211f57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055612174565b6060840151600182015460ff6201000090910416151590151514612174576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016106f8565b60a0840151805161010010156121a0576001604051631b3fab5160e11b81526004016106f89190615aaa565b61220684846003018054806020026020016040519081016040528092919081815260200182805480156121fc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121de575b50505050506133e1565b84606001511561232d5761227484846002018054806020026020016040519081016040528092919081815260200182805480156121fc576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121de5750505050506133e1565b6080850151805161010010156122a0576002604051631b3fab5160e11b81526004016106f89190615aaa565b60408601516122b0906003615ac4565b60ff168151116122d6576003604051631b3fab5160e11b81526004016106f89190615aaa565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff84160217905561231e9060028601906020840190613e86565b5061232b8582600161344a565b505b6123398482600261344a565b805161234e9060038501906020840190613e86565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936123a79389939260028a01929190615ae0565b60405180910390a1611904846135be565b815181516040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608083901b77ffffffffffffffff00000000000000000000000000000000166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa15801561245b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247f91906154fe565b1561250b5780156124c8576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016106f8565b60405167ffffffffffffffff831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b60006125168361190b565b6001018054612524906157d4565b80601f0160208091040260200160405190810160405280929190818152602001828054612550906157d4565b801561259d5780601f106125725761010080835404028352916020019161259d565b820191906000526020600020905b81548152906001019060200180831161258057829003601f168201915b505050602088015151929350505060008190036125e5576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8560400151518114612623576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561263e5761263e613f0d565b604051908082528060200260200182016040528015612667578160200160208202803683370190505b50905060005b828110156127c05760008860200151828151811061268d5761268d614f73565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff161461272057805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106f8565b8667ffffffffffffffff1681600001516020015167ffffffffffffffff1614612790578051602001516040517f6c95f1eb00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808a16600483015290911660248201526044016106f8565b61279a81866135da565b8383815181106127ac576127ac614f73565b60209081029190910101525060010161266d565b5060006127d786838a606001518b608001516136fc565b90508060000361281f576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff871660048201526024016106f8565b60005b83811015610cb65760005a905060008a60200151838151811061284757612847614f73565b6020026020010151905060006128658a836000015160600151610d2a565b9050600081600381111561287b5761287b614ae0565b14806128985750600381600381111561289657612896614ae0565b145b6128f0578151606001516040805167ffffffffffffffff808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a1505050612d30565b88156129c057600454600090600160a01b900463ffffffff1661291387426155e6565b11905080806129335750600382600381111561293157612931614ae0565b145b612975576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c1660048201526024016106f8565b8b858151811061298757612987614f73565b60200260200101516000146129ba578b85815181106129a8576129a8614f73565b60200260200101518360800181815250505b50612a21565b60008160038111156129d4576129d4614ae0565b14612a21578151606001516040805167ffffffffffffffff808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe6512091016128e0565b81516080015167ffffffffffffffff1615612b10576000816003811115612a4a57612a4a614ae0565b03612b105781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612ac1928f929190600401615b8c565b6020604051808303816000875af1158015612ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0491906154fe565b612b1057505050612d30565b60008c604001518581518110612b2857612b28614f73565b6020026020010151905080518360a001515114612b8c578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808e16600483015290911660248201526044016106f8565b612ba08b846000015160600151600161373a565b600080612bad85846137e2565b91509150612bc48d8660000151606001518461373a565b8b15612c34576003826003811115612bde57612bde614ae0565b03612c34576000846003811115612bf757612bf7614ae0565b14612c34578451516040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526106f891908390600401615bb9565b6002826003811115612c4857612c48614ae0565b14612ca2576003826003811115612c6157612c61614ae0565b14612ca2578451606001516040517f926c5a3e0000000000000000000000000000000000000000000000000000000081526106f8918f918590600401615bd2565b84600001516000015185600001516060015167ffffffffffffffff168e67ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8c8b81518110612cfc57612cfc614f73565b602002602001015186865a612d11908e6155e6565b604051612d219493929190615bf8565b60405180910390a45050505050505b600101612822565b8251600090815b818110156111b8576000600188868460208110612d5e57612d5e614f73565b612d6b91901a601b6159ff565b898581518110612d7d57612d7d614f73565b6020026020010151898681518110612d9757612d97614f73565b602002602001015160405160008152602001604052604051612dd5949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612df7573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b03851683528152858220858701909652855480841686529397509095509293928401916101009004166002811115612e5857612e58614ae0565b6002811115612e6957612e69614ae0565b9052509050600181602001516002811115612e8657612e86614ae0565b14612ebd576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615612f00576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050612d3f565b60408051808201909152600080825260208201526000612f4087602001516138ac565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe99190615c2f565b90506001600160a01b0381161580613031575061302f6001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000611fb5565b155b15613073576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106f8565b60045460009081906130959089908690600160e01b900463ffffffff16613952565b9150915060008060006131626040518061010001604052808e81526020018c67ffffffffffffffff1681526020018d6001600160a01b031681526020018f606001518152602001896001600160a01b031681526020018f6000015181526020018f6040015181526020018b8152506040516024016131139190615c4c565b60408051601f198184030181529190526020810180516001600160e01b03167f390775370000000000000000000000000000000000000000000000000000000017905287866113886084613a80565b925092509250826131a157816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106f891906148fb565b81516020146131e95781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106f8565b6000828060200190518101906131ff9190615d19565b9050866001600160a01b03168c6001600160a01b0316146132945760006132308d8a61322b868a6155e6565b613952565b5090508681108061324a57508161324788836155e6565b14155b15613292576040517fa966e21f0000000000000000000000000000000000000000000000000000000081526004810183905260248101889052604481018290526064016106f8565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b60006132ee827f01ffc9a700000000000000000000000000000000000000000000000000000000613326565b8015610d7a575061331f827fffffffff00000000000000000000000000000000000000000000000000000000613326565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d915060005190508280156133ca575060208210155b80156133d65750600081115b979650505050505050565b60005b81518110156107245760ff83166000908152600360205260408120835190919084908490811061341657613416614f73565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff191690556001016133e4565b60005b8251811015610d2457600083828151811061346a5761346a614f73565b602002602001015190506000600281111561348757613487614ae0565b60ff80871660009081526003602090815260408083206001600160a01b038716845290915290205461010090041660028111156134c6576134c6614ae0565b146134e7576004604051631b3fab5160e11b81526004016106f89190615aaa565b6001600160a01b038116613527576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561354d5761354d614ae0565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156135aa576135aa614ae0565b02179055509050505080600101905061344d565b60ff8116610581576009805467ffffffffffffffff1916905550565b815160208082015160409283015192516000938493613620937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615d32565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976136699794969395929491939101615d65565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016136a09190615e6a565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b60008061370a858585613ba6565b67ffffffffffffffff8716600090815260086020908152604080832093835292905220549150505b949350505050565b6000600261374960808561560f565b67ffffffffffffffff1661375d9190615636565b9050600061376b8585611ce9565b90508161377a600160046155e6565b901b19168183600381111561379157613791614ae0565b67ffffffffffffffff871660009081526007602052604081209190921b929092179182916137c0608088615a3c565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fa80036b4000000000000000000000000000000000000000000000000000000008152600090606090309063a80036b4906138269087908790600401615eca565b600060405180830381600087803b15801561384057600080fd5b505af1925050508015613851575060015b613890573d80801561387f576040519150601f19603f3d011682016040523d82523d6000602084013e613884565b606091505b506003925090506138a5565b50506040805160208101909152600081526002905b9250929050565b600081516020146138eb57816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106f891906148fb565b6000828060200190518101906139019190615d19565b90506001600160a01b03811180613919575061040081105b15610d7a57826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106f891906148fb565b60008060008060006139cc8860405160240161397d91906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03167f70a082310000000000000000000000000000000000000000000000000000000017905288886113886084613a80565b92509250925082613a0b57816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106f891906148fb565b6020825114613a535781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106f8565b81806020019051810190613a679190615d19565b613a7182886155e6565b94509450505050935093915050565b6000606060008361ffff1667ffffffffffffffff811115613aa357613aa3613f0d565b6040519080825280601f01601f191660200182016040528015613acd576020820181803683370190505b509150863b613b00577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613b33577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613b6c577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613b8f5750835b808352806000602085013e50955095509592505050565b8251825160009190818303613be7576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613bfb57506101018111155b613c18576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613c42576040516309bde33960e01b815260040160405180910390fd5b80600003613c6f5786600081518110613c5d57613c5d614f73565b60200260200101519350505050613e3e565b60008167ffffffffffffffff811115613c8a57613c8a613f0d565b604051908082528060200260200182016040528015613cb3578160200160208202803683370190505b50905060008080805b85811015613ddd5760006001821b8b811603613d175788851015613d00578c5160018601958e918110613cf157613cf1614f73565b60200260200101519050613d39565b8551600185019487918110613cf157613cf1614f73565b8b5160018401938d918110613d2e57613d2e614f73565b602002602001015190505b600089861015613d69578d5160018701968f918110613d5a57613d5a614f73565b60200260200101519050613d8b565b8651600186019588918110613d8057613d80614f73565b602002602001015190505b82851115613dac576040516309bde33960e01b815260040160405180910390fd5b613db68282613e45565b878481518110613dc857613dc8614f73565b60209081029190910101525050600101613cbc565b506001850382148015613def57508683145b8015613dfa57508581145b613e17576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613e2c57613e2c614f73565b60200260200101519750505050505050505b9392505050565b6000818310613e5d57613e588284613e63565b610d77565b610d7783835b6040805160016020820152908101839052606081018290526000906080016136de565b828054828255906000526020600020908101928215613ee8579160200282015b82811115613ee8578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613ea6565b50613ef4929150613ef8565b5090565b5b80821115613ef45760008155600101613ef9565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613f4657613f46613f0d565b60405290565b60405160a0810167ffffffffffffffff81118282101715613f4657613f46613f0d565b60405160c0810167ffffffffffffffff81118282101715613f4657613f46613f0d565b6040805190810167ffffffffffffffff81118282101715613f4657613f46613f0d565b6040516060810167ffffffffffffffff81118282101715613f4657613f46613f0d565b604051601f8201601f1916810167ffffffffffffffff8111828210171561400157614001613f0d565b604052919050565b600067ffffffffffffffff82111561402357614023613f0d565b5060051b60200190565b6001600160a01b038116811461058157600080fd5b803567ffffffffffffffff8116811461405a57600080fd5b919050565b801515811461058157600080fd5b803561405a8161405f565b600067ffffffffffffffff82111561409257614092613f0d565b50601f01601f191660200190565b600082601f8301126140b157600080fd5b81356140c46140bf82614078565b613fd8565b8181528460208386010111156140d957600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561410957600080fd5b823567ffffffffffffffff8082111561412157600080fd5b818501915085601f83011261413557600080fd5b81356141436140bf82614009565b81815260059190911b8301840190848101908883111561416257600080fd5b8585015b838110156142085780358581111561417e5760008081fd5b86016080818c03601f19018113156141965760008081fd5b61419e613f23565b898301356141ab8161402d565b815260406141ba848201614042565b8b8301526060808501356141cd8161405f565b838301529284013592898411156141e657600091508182fd5b6141f48f8d868801016140a0565b908301525085525050918601918601614166565b5098975050505050505050565b600060a0828403121561422757600080fd5b61422f613f4c565b90508135815261424160208301614042565b602082015261425260408301614042565b604082015261426360608301614042565b606082015261427460808301614042565b608082015292915050565b803561405a8161402d565b600082601f83011261429b57600080fd5b813560206142ab6140bf83614009565b82815260059290921b840181019181810190868411156142ca57600080fd5b8286015b84811015611fa957803567ffffffffffffffff808211156142ef5760008081fd5b9088019060a0828b03601f19018113156143095760008081fd5b614311613f4c565b87840135838111156143235760008081fd5b6143318d8a838801016140a0565b825250604080850135848111156143485760008081fd5b6143568e8b838901016140a0565b8a840152506060808601358581111561436f5760008081fd5b61437d8f8c838a01016140a0565b838501525060809150818601358184015250828501359250838311156143a35760008081fd5b6143b18d8a858801016140a0565b9082015286525050509183019183016142ce565b600061014082840312156143d857600080fd5b6143e0613f6f565b90506143ec8383614215565b815260a082013567ffffffffffffffff8082111561440957600080fd5b614415858386016140a0565b602084015260c084013591508082111561442e57600080fd5b61443a858386016140a0565b604084015261444b60e0850161427f565b6060840152610100840135608084015261012084013591508082111561447057600080fd5b5061447d8482850161428a565b60a08301525092915050565b600082601f83011261449a57600080fd5b813560206144aa6140bf83614009565b82815260059290921b840181019181810190868411156144c957600080fd5b8286015b84811015611fa957803567ffffffffffffffff8111156144ed5760008081fd5b6144fb8986838b01016143c5565b8452509183019183016144cd565b600082601f83011261451a57600080fd5b8135602061452a6140bf83614009565b82815260059290921b8401810191818101908684111561454957600080fd5b8286015b84811015611fa957803567ffffffffffffffff8082111561456d57600080fd5b818901915089603f83011261458157600080fd5b858201356145916140bf82614009565b81815260059190911b830160400190878101908c8311156145b157600080fd5b604085015b838110156145ea578035858111156145cd57600080fd5b6145dc8f6040838a01016140a0565b8452509189019189016145b6565b5087525050509284019250830161454d565b600082601f83011261460d57600080fd5b8135602061461d6140bf83614009565b8083825260208201915060208460051b87010193508684111561463f57600080fd5b602086015b84811015611fa95780358352918301918301614644565b600082601f83011261466c57600080fd5b8135602061467c6140bf83614009565b82815260059290921b8401810191818101908684111561469b57600080fd5b8286015b84811015611fa957803567ffffffffffffffff808211156146c05760008081fd5b9088019060a0828b03601f19018113156146da5760008081fd5b6146e2613f4c565b6146ed888501614042565b8152604080850135848111156147035760008081fd5b6147118e8b83890101614489565b8a840152506060808601358581111561472a5760008081fd5b6147388f8c838a0101614509565b83850152506080915081860135858111156147535760008081fd5b6147618f8c838a01016145fc565b918401919091525091909301359083015250835291830191830161469f565b600080604080848603121561479457600080fd5b833567ffffffffffffffff808211156147ac57600080fd5b6147b88783880161465b565b94506020915081860135818111156147cf57600080fd5b8601601f810188136147e057600080fd5b80356147ee6140bf82614009565b81815260059190911b8201840190848101908a83111561480d57600080fd5b8584015b83811015614899578035868111156148295760008081fd5b8501603f81018d1361483b5760008081fd5b8781013561484b6140bf82614009565b81815260059190911b82018a0190898101908f83111561486b5760008081fd5b928b01925b828410156148895783358252928a0192908a0190614870565b8652505050918601918601614811565b50809750505050505050509250929050565b60005b838110156148c65781810151838201526020016148ae565b50506000910152565b600081518084526148e78160208601602086016148ab565b601f01601f19169290920160200192915050565b602081526000610d7760208301846148cf565b8060608101831015610d7a57600080fd5b60008083601f84011261493157600080fd5b50813567ffffffffffffffff81111561494957600080fd5b6020830191508360208285010111156138a557600080fd5b60008083601f84011261497357600080fd5b50813567ffffffffffffffff81111561498b57600080fd5b6020830191508360208260051b85010111156138a557600080fd5b60008060008060008060008060e0898b0312156149c257600080fd5b6149cc8a8a61490e565b9750606089013567ffffffffffffffff808211156149e957600080fd5b6149f58c838d0161491f565b909950975060808b0135915080821115614a0e57600080fd5b614a1a8c838d01614961565b909750955060a08b0135915080821115614a3357600080fd5b50614a408b828c01614961565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215614a6e57600080fd5b614a78858561490e565b9250606084013567ffffffffffffffff811115614a9457600080fd5b614aa08682870161491f565b9497909650939450505050565b60008060408385031215614ac057600080fd5b614ac983614042565b9150614ad760208401614042565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614b0657614b06614ae0565b9052565b60208101610d7a8284614af6565b600060208284031215614b2a57600080fd5b813567ffffffffffffffff811115614b4157600080fd5b820160a08185031215613e3e57600080fd5b803563ffffffff8116811461405a57600080fd5b600060a08284031215614b7957600080fd5b614b81613f4c565b8235614b8c8161402d565b8152614b9a60208401614b53565b6020820152614bab60408401614b53565b6040820152614bbc60608401614b53565b60608201526080830135614bcf8161402d565b60808201529392505050565b600080600060408486031215614bf057600080fd5b833567ffffffffffffffff80821115614c0857600080fd5b614c14878388016143c5565b94506020860135915080821115614c2a57600080fd5b50614aa086828701614961565b803560ff8116811461405a57600080fd5b600060208284031215614c5a57600080fd5b610d7782614c37565b60008151808452602080850194506020840160005b83811015614c9d5781516001600160a01b031687529582019590820190600101614c78565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614cf760e0840182614c63565b90506040840151601f198483030160c0850152614d148282614c63565b95945050505050565b60008060408385031215614d3057600080fd5b614d3983614042565b946020939093013593505050565b600060208284031215614d5957600080fd5b610d7782614042565b602081526001600160a01b03825116602082015260208201511515604082015267ffffffffffffffff60408301511660608201526000606083015160808084015261373260a08401826148cf565b600060208284031215614dc257600080fd5b8135613e3e8161402d565b600082601f830112614dde57600080fd5b81356020614dee6140bf83614009565b8083825260208201915060208460051b870101935086841115614e1057600080fd5b602086015b84811015611fa9578035614e288161402d565b8352918301918301614e15565b60006020808385031215614e4857600080fd5b823567ffffffffffffffff80821115614e6057600080fd5b818501915085601f830112614e7457600080fd5b8135614e826140bf82614009565b81815260059190911b83018401908481019088831115614ea157600080fd5b8585015b8381101561420857803585811115614ebc57600080fd5b860160c0818c03601f19011215614ed35760008081fd5b614edb613f6f565b8882013581526040614eee818401614c37565b8a8301526060614eff818501614c37565b8284015260809150614f1282850161406d565b9083015260a08381013589811115614f2a5760008081fd5b614f388f8d83880101614dcd565b838501525060c0840135915088821115614f525760008081fd5b614f608e8c84870101614dcd565b9083015250845250918601918601614ea5565b634e487b7160e01b600052603260045260246000fd5b80356001600160e01b038116811461405a57600080fd5b600082601f830112614fb157600080fd5b81356020614fc16140bf83614009565b82815260069290921b84018101918181019086841115614fe057600080fd5b8286015b84811015611fa95760408189031215614ffd5760008081fd5b615005613f92565b61500e82614042565b815261501b858301614f89565b81860152835291830191604001614fe4565b600082601f83011261503e57600080fd5b8135602061504e6140bf83614009565b82815260059290921b8401810191818101908684111561506d57600080fd5b8286015b84811015611fa957803567ffffffffffffffff808211156150925760008081fd5b9088019060a0828b03601f19018113156150ac5760008081fd5b6150b4613f4c565b6150bf888501614042565b815260406150ce818601614042565b8983015260606150df818701614042565b8284015260809150818601358184015250828501359250838311156151045760008081fd5b6151128d8a858801016140a0565b908201528652505050918301918301615071565b600082601f83011261513757600080fd5b813560206151476140bf83614009565b82815260069290921b8401810191818101908684111561516657600080fd5b8286015b84811015611fa957604081890312156151835760008081fd5b61518b613f92565b81358152848201358582015283529183019160400161516a565b600060208083850312156151b857600080fd5b823567ffffffffffffffff808211156151d057600080fd5b90840190606082870312156151e457600080fd5b6151ec613fb5565b8235828111156151fb57600080fd5b8301604081890381131561520e57600080fd5b615216613f92565b82358581111561522557600080fd5b8301601f81018b1361523657600080fd5b80356152446140bf82614009565b81815260069190911b8201890190898101908d83111561526357600080fd5b928a01925b828410156152b35785848f0312156152805760008081fd5b615288613f92565b84356152938161402d565b81526152a0858d01614f89565b818d0152825292850192908a0190615268565b8452505050828701359150848211156152cb57600080fd5b6152d78a838501614fa0565b818801528352505082840135828111156152f057600080fd5b6152fc8882860161502d565b8583015250604083013593508184111561531557600080fd5b61532187858501615126565b60408201529695505050505050565b600082825180855260208086019550808260051b84010181860160005b848110156153c057858303601f190189528151805167ffffffffffffffff908116855285820151811686860152604080830151909116908501526060808201519085015260809081015160a0918501829052906153ac818601836148cf565b9a86019a945050509083019060010161534d565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015614c9d5781518051885283015183880152604090960195908201906001016153e2565b60408152600061541c6040830185615330565b8281036020840152614d1481856153cd565b805160408084528151848201819052600092602091908201906060870190855b8181101561548557835180516001600160a01b031684528501516001600160e01b031685840152928401929185019160010161544e565b50508583015187820388850152805180835290840192506000918401905b808310156154df578351805167ffffffffffffffff1683528501516001600160e01b0316858301529284019260019290920191908501906154a3565b50979650505050505050565b602081526000610d77602083018461542e565b60006020828403121561551057600080fd5b8151613e3e8161405f565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156155525761555261551b565b5092915050565b602081526000825160606020840152615575608084018261542e565b90506020840151601f19808584030160408601526155938383615330565b9250604086015191508085840301606086015250614d1482826153cd565b6000602082840312156155c357600080fd5b813567ffffffffffffffff8111156155da57600080fd5b6137328482850161465b565b81810381811115610d7a57610d7a61551b565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061562a5761562a6155f9565b92169190910692915050565b8082028115828204841417610d7a57610d7a61551b565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261568160a08701826148cf565b90506060850151868203606088015261569a82826148cf565b608087810151898303918a01919091528051808352908601935060009250908501905b808310156154df57835180516001600160a01b03168352860151868301529285019260019290920191908401906156bd565b602081526000610d77602083018461564d565b608081526000615715608083018761564d565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561575357600080fd5b835161575e8161405f565b602085015190935067ffffffffffffffff81111561577b57600080fd5b8401601f8101861361578c57600080fd5b805161579a6140bf82614078565b8181528760208385010111156157af57600080fd5b6157c08260208301602086016148ab565b809450505050604084015190509250925092565b600181811c908216806157e857607f821691505b60208210810361580857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610724576000816000526020600020601f850160051c810160208610156158375750805b601f850160051c820191505b8181101561585657828155600101615843565b505050505050565b815167ffffffffffffffff81111561587857615878613f0d565b61588c8161588684546157d4565b8461580e565b602080601f8311600181146158c157600084156158a95750858301515b600019600386901b1c1916600185901b178555615856565b600085815260208120601f198616915b828110156158f0578886015182559484019460019091019084016158d1565b508582101561590e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835283546001600160a01b038116602085015260ff8160a01c161515604085015267ffffffffffffffff8160a81c16606085015250600180850160808086015260008154615970816157d4565b8060a089015260c0600183166000811461599157600181146159ad576159dd565b60ff19841660c08b015260c083151560051b8b010194506159dd565b85600052602060002060005b848110156159d45781548c82018501529088019089016159b9565b8b0160c0019550505b50929998505050505050505050565b80820180821115610d7a57610d7a61551b565b60ff8181168382160190811115610d7a57610d7a61551b565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff80841680615a5757615a576155f9565b92169190910492915050565b6000808335601e19843603018112615a7a57600080fd5b83018035915067ffffffffffffffff821115615a9557600080fd5b6020019150368190038213156138a557600080fd5b6020810160058310615abe57615abe614ae0565b91905290565b60ff81811683821602908116908181146155525761555261551b565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615b385784546001600160a01b031683526001948501949284019201615b13565b50508481036060860152865180825290820192508187019060005b81811015615b785782516001600160a01b031685529383019391830191600101615b53565b50505060ff85166080850152509050611fab565b600067ffffffffffffffff808616835280851660208401525060606040830152614d1460608301846148cf565b82815260406020820152600061373260408301846148cf565b67ffffffffffffffff848116825283166020820152606081016137326040830184614af6565b848152615c086020820185614af6565b608060408201526000615c1e60808301856148cf565b905082606083015295945050505050565b600060208284031215615c4157600080fd5b8151613e3e8161402d565b6020815260008251610100806020850152615c6b6101208501836148cf565b91506020850151615c88604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615cc260a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615cdf84836148cf565b935060c08701519150808685030160e0870152615cfc84836148cf565b935060e0870151915080868503018387015250611fab83826148cf565b600060208284031215615d2b57600080fd5b5051919050565b848152600067ffffffffffffffff808616602084015280851660408401525060806060830152611fab60808301846148cf565b86815260c060208201526000615d7e60c08301886148cf565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b848110156153c057601f19868403018952815160a08151818652615dfb828701826148cf565b9150508582015185820387870152615e1382826148cf565b91505060408083015186830382880152615e2d83826148cf565b92505050606080830151818701525060808083015192508582038187015250615e5681836148cf565b9a86019a9450505090830190600101615dd5565b602081526000610d776020830184615db8565b60008282518085526020808601955060208260051b8401016020860160005b848110156153c057601f19868403018952615eb88383516148cf565b98840198925090830190600101615e9c565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615f326101808501836148cf565b91506040860151603f198086850301610100870152615f5184836148cf565b935060608801519150615f706101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615f978282615db8565b9150508281036020840152614d148185615e7d56fea164736f6c6343000818000a", + Bin: "0x6101206040523480156200001257600080fd5b50604051620074ea380380620074ea8339810160408190526200003591620008c7565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003c1565b50505062000c67565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b031916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b60005b815181101562000666576000828281518110620003e557620003e562000a1d565b60200260200101519050600081602001519050806001600160401b0316600003620004235760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166200044c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291620004789062000a33565b80601f0160208091040260200160405190810160405280929190818152602001828054620004a69062000a33565b8015620004f75780601f10620004cb57610100808354040283529160200191620004f7565b820191906000526020600020905b815481529060010190602001808311620004d957829003601f168201915b5050505050905060008460600151905081516000036200059e57805160000362000534576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000544828262000ac4565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005d9565b8080519060200120828051906020012014620005d95760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906200064d90869062000b90565b60405180910390a25050505050806001019050620003c4565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620006a557620006a56200066a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006d657620006d66200066a565b604052919050565b80516001600160401b0381168114620006f657600080fd5b919050565b6001600160a01b03811681146200071157600080fd5b50565b805163ffffffff81168114620006f657600080fd5b6000601f83601f8401126200073d57600080fd5b825160206001600160401b03808311156200075c576200075c6200066a565b8260051b6200076d838201620006ab565b93845286810183019383810190898611156200078857600080fd5b84890192505b85831015620008ba57825184811115620007a85760008081fd5b89016080601f19828d038101821315620007c25760008081fd5b620007cc62000680565b88840151620007db81620006fb565b81526040620007ec858201620006de565b8a8301526060808601518015158114620008065760008081fd5b838301529385015193898511156200081e5760008081fd5b84860195508f603f8701126200083657600094508485fd5b8a8601519450898511156200084f576200084f6200066a565b620008608b858f88011601620006ab565b93508484528f82868801011115620008785760008081fd5b60005b8581101562000898578681018301518582018d01528b016200087b565b5060009484018b0194909452509182015283525091840191908401906200078e565b9998505050505050505050565b6000806000838503610140811215620008df57600080fd5b6080811215620008ee57600080fd5b620008f862000680565b6200090386620006de565b815260208601516200091581620006fb565b602082015260408601516200092a81620006fb565b604082015260608601516200093f81620006fb565b6060820152935060a0607f19820112156200095957600080fd5b5060405160a081016001600160401b0380821183831017156200098057620009806200066a565b81604052608087015191506200099682620006fb565b818352620009a760a0880162000714565b6020840152620009ba60c0880162000714565b6040840152620009cd60e0880162000714565b60608401526101008701519150620009e582620006fb565b608083018290526101208701519294508083111562000a0357600080fd5b505062000a138682870162000729565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4857607f821691505b60208210810362000a6957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000abf576000816000526020600020601f850160051c8101602086101562000a9a5750805b601f850160051c820191505b8181101562000abb5782815560010162000aa6565b5050505b505050565b81516001600160401b0381111562000ae05762000ae06200066a565b62000af88162000af1845462000a33565b8462000a6f565b602080601f83116001811462000b30576000841562000b175750858301515b600019600386901b1c1916600185901b17855562000abb565b600085815260208120601f198616915b8281101562000b615788860151825594840194600190910190840162000b40565b508582101562000b805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000be58162000a33565b8060a089015260c0600183166000811462000c09576001811462000c265762000c58565b60ff19841660c08b015260c083151560051b8b0101945062000c58565b85600052602060002060005b8481101562000c4f5781548c820185015290880190890162000c32565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e0516101005161680d62000cdd6000396000818161025a0152612e7d01526000818161021e015261338b0152600081816101e20152818161081101528181610a4901526127d40152600081816101b20152612a6e015260008181611a2f0152611a7b015261680d6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e146105af578063f2fde38b146105cf578063f716f99f146105e257600080fd5b8063c673e5841461054a578063ccd37ba31461056a57600080fd5b80638da5cb5b116100b25780638da5cb5b146104fc578063991a501814610524578063a80036b41461053757600080fd5b806379ba5097146104e657806385572ffb146104ee57600080fd5b80632d04ab76116101245780633f4b04aa116101095780633f4b04aa1461036a5780635e36480c146103865780637437ff9f146103a657600080fd5b80632d04ab7614610344578063311cd5131461035757600080fd5b806304666f9c1461015657806305d938b51461016b57806306285c691461017e578063181f5a77146102fb575b600080fd5b610169610164366004614759565b6105f5565b005b610169610179366004614de5565b610609565b61029760408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102f29190815167ffffffffffffffff16815260208083015173ffffffffffffffffffffffffffffffffffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103376040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102f29190614f60565b61016961035236600461500b565b6107ae565b6101696103653660046150be565b610da8565b60095460405167ffffffffffffffff90911681526020016102f2565b610399610394366004615112565b610e11565b6040516102f29190615188565b61047c6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260045473ffffffffffffffffffffffffffffffffffffffff808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152780100000000000000000000000000000000000000000000000083048116948401949094527c01000000000000000000000000000000000000000000000000000000009091049092166060820152600554909116608082015290565b6040516102f29190600060a08201905073ffffffffffffffffffffffffffffffffffffffff808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b610169610e67565b610169610151366004615196565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f2565b6101696105323660046151e5565b610f64565b610169610545366004615259565b610f75565b61055d6105583660046152c6565b611329565b6040516102f29190615333565b6105a16105783660046153a8565b67ffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102f2565b6105c26105bd3660046153d2565b6114a1565b6040516102f291906153ed565b6101696105dd366004615448565b6115de565b6101696105f03660046154cd565b6115ef565b6105fd611631565b610606816116b4565b50565b610611611a2c565b81518151811461064d576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561079e57600084828151811061066c5761066c61560b565b602002602001015190506000816020015151905060008584815181106106945761069461560b565b60200260200101519050805182146106d8576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8281101561078f5760008282815181106106f7576106f761560b565b6020026020010151905080600014610786578460200151828151811061071f5761071f61560b565b6020026020010151608001518110156107865784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064015b60405180910390fd5b506001016106db565b50505050806001019050610650565b506107a98383611aad565b505050565b60006107bc8789018961586c565b6020810151519091501561087557602081015160408083015190517f30dfc30800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926330dfc3089261084492600401615ad0565b60006040518083038186803b15801561085c57600080fd5b505afa158015610870573d6000803e3d6000fd5b505050505b8051515115158061088b57508051602001515115155b156109af5760095460208a01359067ffffffffffffffff8083169116101561096e57600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790556004805483516040517f3937306f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921692633937306f92610937929101615be9565b600060405180830381600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b505050506109ad565b8160200151516000036109ad576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b816020015151811015610cf1576000826020015182815181106109d7576109d761560b565b602090810291909101015180516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b1660048201529192509073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab49190615bfc565b15610af7576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161077d565b6000610b0282611b5d565b6020840151815491925067ffffffffffffffff908116750100000000000000000000000000000000000000000090920416141580610b5b5750826040015167ffffffffffffffff16836020015167ffffffffffffffff16115b15610bbc578251602084015160408086015190517fd5e0f0d600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9384166004820152918316602483015291909116604482015260640161077d565b606083015180610bf8576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff16600090815260086020908152604080832084845290915290205415610c6b5783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810182905260440161077d565b6040840151610c7b906001615c48565b82547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000067ffffffffffffffff9283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016109b2565b507fd7868a16facbdde7b5c020620136316b3c266fffcb4e1e41cb6a662fe14ba3e181604051610d219190615c70565b60405180910390a1610d9d60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611bd5915050565b505050505050505050565b610de8610db782840184615cc8565b6040805160008082526020820190925290610de2565b6060815260200190600190039081610dcd5790505b50611aad565b604080516000808252602082019092529050610e0b600185858585866000611bd5565b50505050565b6000610e1f60016004615cfd565b6002610e2c608085615d3f565b67ffffffffffffffff16610e409190615d66565b610e4a8585611f59565b901c166003811115610e5e57610e5e615145565b90505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161077d565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f6c611631565b61060681611fa0565b333014610fae576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610feb565b6040805180820190915260008082526020820152815260200190600190039081610fc45790505b5060a0850151519091501561101f5761101c8460a00151856020015186606001518760000151602001518787612183565b90505b6040805160a0810182528551518152855160209081015167ffffffffffffffff168183015280870151835160009484019261105b929101614f60565b60408051601f198184030181529181529082528781015160208301520183905260055490915073ffffffffffffffffffffffffffffffffffffffff168015611182576040517f08d450a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906308d450a1906110ef908590600401615e2c565b600060405180830381600087803b15801561110957600080fd5b505af192505050801561111a575060015b611182573d808015611148576040519150601f19603f3d011682016040523d82523d6000602084013e61114d565b606091505b50806040517f09c2532500000000000000000000000000000000000000000000000000000000815260040161077d9190614f60565b60408601515115801561119757506080860151155b806111bb5750606086015173ffffffffffffffffffffffffffffffffffffffff163b155b80611208575060608601516112069073ffffffffffffffffffffffffffffffffffffffff167f85572ffb000000000000000000000000000000000000000000000000000000006122a2565b155b1561121557505050505050565b855160209081015167ffffffffffffffff1660009081526006909152604080822054608089015160608a015192517f3cf97983000000000000000000000000000000000000000000000000000000008152849373ffffffffffffffffffffffffffffffffffffffff90931692633cf979839261129a9289926113889291600401615e3f565b6000604051808303816000875af11580156112b9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112e19190810190615e88565b50915091508161131f57806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161077d9190614f60565b5050505050505050565b61136c6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561142257602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116113f7575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561149157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611466575b5050505050815250509050919050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff8781168452600683529286902086519485018752805473ffffffffffffffffffffffffffffffffffffffff8116865274010000000000000000000000000000000000000000810460ff16151593860193909352750100000000000000000000000000000000000000000090920490921694830194909452600184018054939492939184019161155e90615f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461158a90615f1e565b80156114915780601f106115ac57610100808354040283529160200191611491565b820191906000526020600020905b8154815290600101906020018083116115ba57505050919092525091949350505050565b6115e6611631565b610606816122be565b6115f7611631565b60005b815181101561162d576116258282815181106116185761161861560b565b60200260200101516123b3565b6001016115fa565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161077d565b565b60005b815181101561162d5760008282815181106116d4576116d461560b565b602002602001015190506000816020015190508067ffffffffffffffff1660000361172b576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16611779576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660009081526006602052604081206001810180549192916117a490615f1e565b80601f01602080910402602001604051908101604052809291908181526020018280546117d090615f1e565b801561181d5780601f106117f25761010080835404028352916020019161181d565b820191906000526020600020905b81548152906001019060200180831161180057829003601f168201915b505050505090506000846060015190508151600003611900578051600003611871576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001830161187f8282615fc1565b5082547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611953565b8080519060200120828051906020012014611953576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8516600482015260240161077d565b6040808601518454875173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000009215157401000000000000000000000000000000000000000002929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171784555167ffffffffffffffff8516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b90611a149086906160bd565b60405180910390a250505050508060010190506116b7565b467f0000000000000000000000000000000000000000000000000000000000000000146116b2576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161077d565b8151600003611ae7576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611b5657611b4e858281518110611b1c57611b1c61560b565b602002602001015184611b4857858381518110611b3b57611b3b61560b565b6020026020010151612780565b83612780565b600101611afe565b5050505050565b67ffffffffffffffff81166000908152600660205260408120805474010000000000000000000000000000000000000000900460ff16610e61576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161077d565b60ff87811660009081526002602090815260408083208151608081018352815481526001909101548086169382019390935261010083048516918101919091526201000090910490921615156060830152873590611c348760a46161b6565b9050826060015115611c7c578451611c4d906020615d66565b8651611c5a906020615d66565b611c659060a06161b6565b611c6f91906161b6565b611c7990826161b6565b90505b368114611cbe576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161077d565b5081518114611d065781516040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161077d565b611d0e611a2c565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611d5c57611d5c615145565b6002811115611d6d57611d6d615145565b9052509050600281602001516002811115611d8a57611d8a615145565b148015611deb5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611dc657611dc661560b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611e21576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611f03576020820151611e3c9060016161c9565b60ff16855114611e78576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611eb3576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611ec59291906161e2565b604051908190038120611edc918b906020016161f2565b604051602081830303815290604052805190602001209050611f018a8288888861312b565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b67ffffffffffffffff8216600090815260076020526040812081611f7e608085616206565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b805173ffffffffffffffffffffffffffffffffffffffff16611fee576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b01805173ffffffffffffffffffffffffffffffffffffffff9b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16939093177c010000000000000000000000000000000000000000000000000000000093871693909302929092179098556080808b018051600580547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b6060865167ffffffffffffffff81111561219f5761219f61454a565b6040519080825280602002602001820160405280156121e457816020015b60408051808201909152600080825260208201528152602001906001900390816121bd5790505b50905060005b8751811015612296576122718882815181106122085761220861560b565b60200260200101518888888888878181106122255761222561560b565b9050602002810190612237919061622d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061331d92505050565b8282815181106122835761228361560b565b60209081029190910101526001016121ea565b505b9695505050505050565b60006122ad83613765565b8015610e5e5750610e5e83836137c9565b3373ffffffffffffffffffffffffffffffffffffffff82160361233d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161077d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff166000036123f75760006040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161077d9190616292565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361246457606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff9092169190911790556124b9565b6060840151600182015460ff62010000909104161515901515146124b9576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff8416600482015260240161077d565b60a0840151805161010010156124fe5760016040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161077d9190616292565b612571848460030180548060200260200160405190810160405280929190818152602001828054801561256757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161253c575b5050505050613899565b8460600151156126d7576125ec84846002018054806020026020016040519081016040528092919081815260200182805480156125675760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161253c575050505050613899565b6080850151805161010010156126315760026040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161077d9190616292565b60408601516126419060036162ac565b60ff168151116126805760036040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161077d9190616292565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff8416021790556126c890600286019060208401906144ab565b506126d58582600161392c565b505b6126e38482600261392c565b80516126f890600385019060208401906144ab565b506040858101516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361276f9389939260028a019291906162c8565b60405180910390a1611b5684613b1b565b815181516040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608083901b77ffffffffffffffff00000000000000000000000000000000166004820152901515907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015612830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128549190615bfc565b156128e057801561289d576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161077d565b60405167ffffffffffffffff831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b60006128eb83611b5d565b60010180546128f990615f1e565b80601f016020809104026020016040519081016040528092919081815260200182805461292590615f1e565b80156129725780601f1061294757610100808354040283529160200191612972565b820191906000526020600020905b81548152906001019060200180831161295557829003601f168201915b505050602088015151929350505060008190036129ba576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85604001515181146129f8576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612a1357612a1361454a565b604051908082528060200260200182016040528015612a3c578160200160208202803683370190505b50905060005b82811015612b9557600088602001518281518110612a6257612a6261560b565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff1614612af557805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161077d565b8667ffffffffffffffff1681600001516020015167ffffffffffffffff1614612b65578051602001516040517f6c95f1eb00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808a166004830152909116602482015260440161077d565b612b6f8186613b4e565b838381518110612b8157612b8161560b565b602090810291909101015250600101612a42565b506000612bac86838a606001518b60800151613c70565b905080600003612bf4576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8716600482015260240161077d565b60005b83811015610d9d5760005a905060008a602001518381518110612c1c57612c1c61560b565b602002602001015190506000612c3a8a836000015160600151610e11565b90506000816003811115612c5057612c50615145565b1480612c6d57506003816003811115612c6b57612c6b615145565b145b612cc5578151606001516040805167ffffffffffffffff808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a1505050613123565b8815612da65760045460009074010000000000000000000000000000000000000000900463ffffffff16612cf98742615cfd565b1190508080612d1957506003826003811115612d1757612d17615145565b145b612d5b576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015260240161077d565b8b8581518110612d6d57612d6d61560b565b6020026020010151600014612da0578b8581518110612d8e57612d8e61560b565b60200260200101518360800181815250505b50612e07565b6000816003811115612dba57612dba615145565b14612e07578151606001516040805167ffffffffffffffff808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209101612cb5565b81516080015167ffffffffffffffff1615612f03576000816003811115612e3057612e30615145565b03612f035781516080015160208301516040517fe0e03cae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612eb4928f92919060040161638e565b6020604051808303816000875af1158015612ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef79190615bfc565b612f0357505050613123565b60008c604001518581518110612f1b57612f1b61560b565b6020026020010151905080518360a001515114612f7f578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808e166004830152909116602482015260440161077d565b612f938b8460000151606001516001613cae565b600080612fa08584613d56565b91509150612fb78d86600001516060015184613cae565b8b15613027576003826003811115612fd157612fd1615145565b03613027576000846003811115612fea57612fea615145565b14613027578451516040517f2b11b8d900000000000000000000000000000000000000000000000000000000815261077d919083906004016163bb565b600282600381111561303b5761303b615145565b1461309557600382600381111561305457613054615145565b14613095578451606001516040517f926c5a3e00000000000000000000000000000000000000000000000000000000815261077d918f9185906004016163d4565b84600001516000015185600001516060015167ffffffffffffffff168e67ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8c8b815181106130ef576130ef61560b565b602002602001015186865a613104908e615cfd565b60405161311494939291906163fa565b60405180910390a45050505050505b600101612bf7565b8251600090815b8181101561131f5760006001888684602081106131515761315161560b565b61315e91901a601b6161c9565b8985815181106131705761317061560b565b602002602001015189868151811061318a5761318a61560b565b6020026020010151604051600081526020016040526040516131c8949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156131ea573d6000803e3d6000fd5b505060408051601f1981015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff85168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561325857613258615145565b600281111561326957613269615145565b905250905060018160200151600281111561328657613286615145565b146132bd576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615613300576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050613132565b604080518082019091526000808252602082015260006133408760200151613e20565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156133d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f69190616431565b905073ffffffffffffffffffffffffffffffffffffffff81161580613458575061345673ffffffffffffffffffffffffffffffffffffffff82167faff2afbf000000000000000000000000000000000000000000000000000000006122a2565b155b156134a7576040517fae9b4ce900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240161077d565b60045460009081906134e290899086907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16613ed3565b9150915060008060006135de6040518061010001604052808e81526020018c67ffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018f6060015181526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018f6000015181526020018f6040015181526020018b81525060405160240161357a919061644e565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f390775370000000000000000000000000000000000000000000000000000000017905287866113886084614023565b9250925092508261361d57816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161077d9190614f60565b81516020146136655781516040517f78ef802400000000000000000000000000000000000000000000000000000000815260206004820152602481019190915260440161077d565b60008280602001905181019061367b9190616535565b90508673ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161461372a5760006136c68d8a6136c1868a615cfd565b613ed3565b509050868110806136e05750816136dd8883615cfd565b14155b15613728576040517fa966e21f00000000000000000000000000000000000000000000000000000000815260048101839052602481018890526044810182905260640161077d565b505b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9098168852602088015250949550505050505095945050505050565b6000613791827f01ffc9a7000000000000000000000000000000000000000000000000000000006137c9565b8015610e6157506137c2827fffffffff000000000000000000000000000000000000000000000000000000006137c9565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d91506000519050828015613882575060208210155b801561388e5750600081115b979650505050505050565b60005b81518110156107a95760ff8316600090815260036020526040812083519091908490849081106138ce576138ce61560b565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161389c565b60005b8251811015610e0b57600083828151811061394c5761394c61560b565b602002602001015190506000600281111561396957613969615145565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205461010090041660028111156139b5576139b5615145565b146139ef5760046040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161077d9190616292565b73ffffffffffffffffffffffffffffffffffffffff8116613a3c576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff168152602001846002811115613a6257613a62615145565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115613b0757613b07615145565b02179055509050505080600101905061392f565b60ff811661060657600980547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905550565b815160208082015160409283015192516000938493613b94937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f9390929188910161654e565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d01519501519597613bdd9794969395929491939101616581565b604051602081830303815290604052805190602001208560400151805190602001208660a00151604051602001613c149190616693565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b600080613c7e858585614149565b67ffffffffffffffff8716600090815260086020908152604080832093835292905220549150505b949350505050565b60006002613cbd608085615d3f565b67ffffffffffffffff16613cd19190615d66565b90506000613cdf8585611f59565b905081613cee60016004615cfd565b901b191681836003811115613d0557613d05615145565b67ffffffffffffffff871660009081526007602052604081209190921b92909217918291613d34608088616206565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fa80036b4000000000000000000000000000000000000000000000000000000008152600090606090309063a80036b490613d9a90879087906004016166f3565b600060405180830381600087803b158015613db457600080fd5b505af1925050508015613dc5575060015b613e04573d808015613df3576040519150601f19603f3d011682016040523d82523d6000602084013e613df8565b606091505b50600392509050613e19565b50506040805160208101909152600081526002905b9250929050565b60008151602014613e5f57816040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161077d9190614f60565b600082806020019051810190613e759190616535565b905073ffffffffffffffffffffffffffffffffffffffff811180613e9a575061040081105b15610e6157826040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161077d9190614f60565b6000806000806000613f6f88604051602401613f0b919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f70a082310000000000000000000000000000000000000000000000000000000017905288886113886084614023565b92509250925082613fae57816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161077d9190614f60565b6020825114613ff65781516040517f78ef802400000000000000000000000000000000000000000000000000000000815260206004820152602481019190915260440161077d565b8180602001905181019061400a9190616535565b6140148288615cfd565b94509450505050935093915050565b6000606060008361ffff1667ffffffffffffffff8111156140465761404661454a565b6040519080825280601f01601f191660200182016040528015614070576020820181803683370190505b509150863b6140a3577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156140d6577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b859003604081048103871061410f577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156141325750835b808352806000602085013e50955095509592505050565b825182516000919081830361418a576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610101821180159061419e57506101018111155b6141d4576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82820101610100811115614235576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000361426257866000815181106142505761425061560b565b60200260200101519350505050614463565b60008167ffffffffffffffff81111561427d5761427d61454a565b6040519080825280602002602001820160405280156142a6578160200160208202803683370190505b50905060008080805b858110156143e95760006001821b8b81160361430a57888510156142f3578c5160018601958e9181106142e4576142e461560b565b6020026020010151905061432c565b85516001850194879181106142e4576142e461560b565b8b5160018401938d9181106143215761432161560b565b602002602001015190505b60008986101561435c578d5160018701968f91811061434d5761434d61560b565b6020026020010151905061437e565b86516001860195889181106143735761437361560b565b602002602001015190505b828511156143b8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143c2828261446a565b8784815181106143d4576143d461560b565b602090810291909101015250506001016142af565b5060018503821480156143fb57508683145b801561440657508581145b61443c576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360018603815181106144515761445161560b565b60200260200101519750505050505050505b9392505050565b60008183106144825761447d8284614488565b610e5e565b610e5e83835b604080516001602082015290810183905260608101829052600090608001613c52565b828054828255906000526020600020908101928215614525579160200282015b8281111561452557825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906144cb565b50614531929150614535565b5090565b5b808211156145315760008155600101614536565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561459c5761459c61454a565b60405290565b60405160a0810167ffffffffffffffff8111828210171561459c5761459c61454a565b60405160c0810167ffffffffffffffff8111828210171561459c5761459c61454a565b6040805190810167ffffffffffffffff8111828210171561459c5761459c61454a565b6040516060810167ffffffffffffffff8111828210171561459c5761459c61454a565b604051601f8201601f1916810167ffffffffffffffff811182821017156146575761465761454a565b604052919050565b600067ffffffffffffffff8211156146795761467961454a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461060657600080fd5b803567ffffffffffffffff811681146146bd57600080fd5b919050565b801515811461060657600080fd5b80356146bd816146c2565b600067ffffffffffffffff8211156146f5576146f561454a565b50601f01601f191660200190565b600082601f83011261471457600080fd5b8135614727614722826146db565b61462e565b81815284602083860101111561473c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561476c57600080fd5b823567ffffffffffffffff8082111561478457600080fd5b818501915085601f83011261479857600080fd5b81356147a66147228261465f565b81815260059190911b830184019084810190888311156147c557600080fd5b8585015b8381101561486b578035858111156147e15760008081fd5b86016080818c03601f19018113156147f95760008081fd5b614801614579565b8983013561480e81614683565b8152604061481d8482016146a5565b8b830152606080850135614830816146c2565b8383015292840135928984111561484957600091508182fd5b6148578f8d86880101614703565b9083015250855250509186019186016147c9565b5098975050505050505050565b600060a0828403121561488a57600080fd5b6148926145a2565b9050813581526148a4602083016146a5565b60208201526148b5604083016146a5565b60408201526148c6606083016146a5565b60608201526148d7608083016146a5565b608082015292915050565b80356146bd81614683565b600082601f8301126148fe57600080fd5b8135602061490e6147228361465f565b82815260059290921b8401810191818101908684111561492d57600080fd5b8286015b8481101561229657803567ffffffffffffffff808211156149525760008081fd5b818901915060a080601f19848d0301121561496d5760008081fd5b6149756145a2565b87840135838111156149875760008081fd5b6149958d8a83880101614703565b825250604080850135848111156149ac5760008081fd5b6149ba8e8b83890101614703565b8a84015250606080860135858111156149d35760008081fd5b6149e18f8c838a0101614703565b83850152506080915081860135818401525082850135925083831115614a075760008081fd5b614a158d8a85880101614703565b908201528652505050918301918301614931565b60006101408284031215614a3c57600080fd5b614a446145c5565b9050614a508383614878565b815260a082013567ffffffffffffffff80821115614a6d57600080fd5b614a7985838601614703565b602084015260c0840135915080821115614a9257600080fd5b614a9e85838601614703565b6040840152614aaf60e085016148e2565b60608401526101008401356080840152610120840135915080821115614ad457600080fd5b50614ae1848285016148ed565b60a08301525092915050565b600082601f830112614afe57600080fd5b81356020614b0e6147228361465f565b82815260059290921b84018101918181019086841115614b2d57600080fd5b8286015b8481101561229657803567ffffffffffffffff811115614b515760008081fd5b614b5f8986838b0101614a29565b845250918301918301614b31565b600082601f830112614b7e57600080fd5b81356020614b8e6147228361465f565b82815260059290921b84018101918181019086841115614bad57600080fd5b8286015b8481101561229657803567ffffffffffffffff80821115614bd157600080fd5b818901915089603f830112614be557600080fd5b85820135614bf56147228261465f565b81815260059190911b830160400190878101908c831115614c1557600080fd5b604085015b83811015614c4e57803585811115614c3157600080fd5b614c408f6040838a0101614703565b845250918901918901614c1a565b50875250505092840192508301614bb1565b600082601f830112614c7157600080fd5b81356020614c816147228361465f565b8083825260208201915060208460051b870101935086841115614ca357600080fd5b602086015b848110156122965780358352918301918301614ca8565b600082601f830112614cd057600080fd5b81356020614ce06147228361465f565b82815260059290921b84018101918181019086841115614cff57600080fd5b8286015b8481101561229657803567ffffffffffffffff80821115614d245760008081fd5b818901915060a080601f19848d03011215614d3f5760008081fd5b614d476145a2565b614d528885016146a5565b815260408085013584811115614d685760008081fd5b614d768e8b83890101614aed565b8a8401525060608086013585811115614d8f5760008081fd5b614d9d8f8c838a0101614b6d565b8385015250608091508186013585811115614db85760008081fd5b614dc68f8c838a0101614c60565b9184019190915250919093013590830152508352918301918301614d03565b6000806040808486031215614df957600080fd5b833567ffffffffffffffff80821115614e1157600080fd5b614e1d87838801614cbf565b9450602091508186013581811115614e3457600080fd5b8601601f81018813614e4557600080fd5b8035614e536147228261465f565b81815260059190911b8201840190848101908a831115614e7257600080fd5b8584015b83811015614efe57803586811115614e8e5760008081fd5b8501603f81018d13614ea05760008081fd5b87810135614eb06147228261465f565b81815260059190911b82018a0190898101908f831115614ed05760008081fd5b928b01925b82841015614eee5783358252928a0192908a0190614ed5565b8652505050918601918601614e76565b50809750505050505050509250929050565b60005b83811015614f2b578181015183820152602001614f13565b50506000910152565b60008151808452614f4c816020860160208601614f10565b601f01601f19169290920160200192915050565b602081526000610e5e6020830184614f34565b8060608101831015610e6157600080fd5b60008083601f840112614f9657600080fd5b50813567ffffffffffffffff811115614fae57600080fd5b602083019150836020828501011115613e1957600080fd5b60008083601f840112614fd857600080fd5b50813567ffffffffffffffff811115614ff057600080fd5b6020830191508360208260051b8501011115613e1957600080fd5b60008060008060008060008060e0898b03121561502757600080fd5b6150318a8a614f73565b9750606089013567ffffffffffffffff8082111561504e57600080fd5b61505a8c838d01614f84565b909950975060808b013591508082111561507357600080fd5b61507f8c838d01614fc6565b909750955060a08b013591508082111561509857600080fd5b506150a58b828c01614fc6565b999c989b50969995989497949560c00135949350505050565b6000806000608084860312156150d357600080fd5b6150dd8585614f73565b9250606084013567ffffffffffffffff8111156150f957600080fd5b61510586828701614f84565b9497909650939450505050565b6000806040838503121561512557600080fd5b61512e836146a5565b915061513c602084016146a5565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061518457615184615145565b9052565b60208101610e618284615174565b6000602082840312156151a857600080fd5b813567ffffffffffffffff8111156151bf57600080fd5b820160a0818503121561446357600080fd5b803563ffffffff811681146146bd57600080fd5b600060a082840312156151f757600080fd5b6151ff6145a2565b823561520a81614683565b8152615218602084016151d1565b6020820152615229604084016151d1565b604082015261523a606084016151d1565b6060820152608083013561524d81614683565b60808201529392505050565b60008060006040848603121561526e57600080fd5b833567ffffffffffffffff8082111561528657600080fd5b61529287838801614a29565b945060208601359150808211156152a857600080fd5b5061510586828701614fc6565b803560ff811681146146bd57600080fd5b6000602082840312156152d857600080fd5b610e5e826152b5565b60008151808452602080850194506020840160005b8381101561532857815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016152f6565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a084015261538260e08401826152e1565b90506040840151601f198483030160c085015261539f82826152e1565b95945050505050565b600080604083850312156153bb57600080fd5b6153c4836146a5565b946020939093013593505050565b6000602082840312156153e457600080fd5b610e5e826146a5565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260208201511515604082015267ffffffffffffffff604083015116606082015260006060830151608080840152613ca660a0840182614f34565b60006020828403121561545a57600080fd5b813561446381614683565b600082601f83011261547657600080fd5b813560206154866147228361465f565b8083825260208201915060208460051b8701019350868411156154a857600080fd5b602086015b848110156122965780356154c081614683565b83529183019183016154ad565b600060208083850312156154e057600080fd5b823567ffffffffffffffff808211156154f857600080fd5b818501915085601f83011261550c57600080fd5b813561551a6147228261465f565b81815260059190911b8301840190848101908883111561553957600080fd5b8585015b8381101561486b5780358581111561555457600080fd5b860160c0818c03601f1901121561556b5760008081fd5b6155736145c5565b88820135815260406155868184016152b5565b8a83015260606155978185016152b5565b82840152608091506155aa8285016146d0565b9083015260a083810135898111156155c25760008081fd5b6155d08f8d83880101615465565b838501525060c08401359150888211156155ea5760008081fd5b6155f88e8c84870101615465565b908301525084525091860191860161553d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146146bd57600080fd5b600082601f83011261567757600080fd5b813560206156876147228361465f565b82815260069290921b840181019181810190868411156156a657600080fd5b8286015b8481101561229657604081890312156156c35760008081fd5b6156cb6145e8565b6156d4826146a5565b81526156e185830161563a565b818601528352918301916040016156aa565b600082601f83011261570457600080fd5b813560206157146147228361465f565b82815260059290921b8401810191818101908684111561573357600080fd5b8286015b8481101561229657803567ffffffffffffffff808211156157585760008081fd5b818901915060a080601f19848d030112156157735760008081fd5b61577b6145a2565b6157868885016146a5565b815260406157958186016146a5565b8983015260606157a68187016146a5565b8284015260809150818601358184015250828501359250838311156157cb5760008081fd5b6157d98d8a85880101614703565b908201528652505050918301918301615737565b600082601f8301126157fe57600080fd5b8135602061580e6147228361465f565b82815260069290921b8401810191818101908684111561582d57600080fd5b8286015b84811015612296576040818903121561584a5760008081fd5b6158526145e8565b813581528482013585820152835291830191604001615831565b6000602080838503121561587f57600080fd5b823567ffffffffffffffff8082111561589757600080fd5b90840190606082870312156158ab57600080fd5b6158b361460b565b8235828111156158c257600080fd5b830160408189038113156158d557600080fd5b6158dd6145e8565b8235858111156158ec57600080fd5b8301601f81018b136158fd57600080fd5b803561590b6147228261465f565b81815260069190911b8201890190898101908d83111561592a57600080fd5b928a01925b8284101561597a5785848f0312156159475760008081fd5b61594f6145e8565b843561595a81614683565b8152615967858d0161563a565b818d0152825292850192908a019061592f565b84525050508287013591508482111561599257600080fd5b61599e8a838501615666565b818801528352505082840135828111156159b757600080fd5b6159c3888286016156f3565b858301525060408301359350818411156159dc57600080fd5b6159e8878585016157ed565b60408201529695505050505050565b600082825180855260208086019550808260051b84010181860160005b84811015615a8757858303601f190189528151805167ffffffffffffffff908116855285820151811686860152604080830151909116908501526060808201519085015260809081015160a091850182905290615a7381860183614f34565b9a86019a9450505090830190600101615a14565b5090979650505050505050565b60008151808452602080850194506020840160005b83811015615328578151805188528301518388015260409096019590820190600101615aa9565b604081526000615ae360408301856159f7565b828103602084015261539f8185615a94565b805160408084528151848201819052600092602091908201906060870190855b81811015615b6e578351805173ffffffffffffffffffffffffffffffffffffffff1684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16858401529284019291850191600101615b15565b50508583015187820388850152805180835290840192506000918401905b80831015615bdd578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685830152928401926001929092019190850190615b8c565b50979650505050505050565b602081526000610e5e6020830184615af5565b600060208284031215615c0e57600080fd5b8151614463816146c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115615c6957615c69615c19565b5092915050565b602081526000825160606020840152615c8c6080840182615af5565b90506020840151601f1980858403016040860152615caa83836159f7565b925060408601519150808584030160608601525061539f8282615a94565b600060208284031215615cda57600080fd5b813567ffffffffffffffff811115615cf157600080fd5b613ca684828501614cbf565b81810381811115610e6157610e61615c19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615d5a57615d5a615d10565b92169190910692915050565b8082028115828204841417610e6157610e61615c19565b805182526000602067ffffffffffffffff81840151168185015260408084015160a06040870152615db160a0870182614f34565b905060608501518682036060880152615dca8282614f34565b608087810151898303918a01919091528051808352908601935060009250908501905b80831015615bdd578351805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152928501926001929092019190840190615ded565b602081526000610e5e6020830184615d7d565b608081526000615e526080830187615d7d565b61ffff95909516602083015250604081019290925273ffffffffffffffffffffffffffffffffffffffff16606090910152919050565b600080600060608486031215615e9d57600080fd5b8351615ea8816146c2565b602085015190935067ffffffffffffffff811115615ec557600080fd5b8401601f81018613615ed657600080fd5b8051615ee4614722826146db565b818152876020838501011115615ef957600080fd5b615f0a826020830160208601614f10565b809450505050604084015190509250925092565b600181811c90821680615f3257607f821691505b602082108103615f6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156107a9576000816000526020600020601f850160051c81016020861015615f9a5750805b601f850160051c820191505b81811015615fb957828155600101615fa6565b505050505050565b815167ffffffffffffffff811115615fdb57615fdb61454a565b615fef81615fe98454615f1e565b84615f71565b602080601f831160018114616042576000841561600c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615fb9565b600085815260208120601f198616915b8281101561607157888601518255948401946001909101908401616052565b50858210156160ad57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808352835473ffffffffffffffffffffffffffffffffffffffff8116602085015260ff8160a01c161515604085015267ffffffffffffffff8160a81c1660608501525060018085016080808601526000815461611c81615f1e565b8060a089015260c0600183166000811461613d5760018114616177576161a7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660c08b015260c083151560051b8b010194506161a7565b85600052602060002060005b8481101561619e5781548c8201850152908801908901616183565b8b0160c0019550505b50929998505050505050505050565b80820180821115610e6157610e61615c19565b60ff8181168382160190811115610e6157610e61615c19565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff8084168061622157616221615d10565b92169190910492915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261626257600080fd5b83018035915067ffffffffffffffff82111561627d57600080fd5b602001915036819003821315613e1957600080fd5b60208101600583106162a6576162a6615145565b91905290565b60ff8181168382160290811690818114615c6957615c69615c19565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b8181101561632d57845473ffffffffffffffffffffffffffffffffffffffff16835260019485019492840192016162fb565b50508481036060860152865180825290820192508187019060005b8181101561637a57825173ffffffffffffffffffffffffffffffffffffffff1685529383019391830191600101616348565b50505060ff85166080850152509050612298565b600067ffffffffffffffff80861683528085166020840152506060604083015261539f6060830184614f34565b828152604060208201526000613ca66040830184614f34565b67ffffffffffffffff84811682528316602082015260608101613ca66040830184615174565b84815261640a6020820185615174565b6080604082015260006164206080830185614f34565b905082606083015295945050505050565b60006020828403121561644357600080fd5b815161446381614683565b602081526000825161010080602085015261646d610120850183614f34565b9150602085015161648a604086018267ffffffffffffffff169052565b50604085015173ffffffffffffffffffffffffffffffffffffffff81166060860152506060850151608085015260808501516164de60a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a0850151601f19808685030160c08701526164fb8483614f34565b935060c08701519150808685030160e08701526165188483614f34565b935060e08701519150808685030183870152506122988382614f34565b60006020828403121561654757600080fd5b5051919050565b848152600067ffffffffffffffff8086166020840152808516604084015250608060608301526122986080830184614f34565b86815260c06020820152600061659a60c0830188614f34565b73ffffffffffffffffffffffffffffffffffffffff9690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b84811015615a8757601f19868403018952815160a0815181865261662482870182614f34565b915050858201518582038787015261663c8282614f34565b915050604080830151868303828801526166568382614f34565b9250505060608083015181870152506080808301519250858203818701525061667f8183614f34565b9a86019a94505050908301906001016165fe565b602081526000610e5e60208301846165e1565b60008282518085526020808601955060208260051b8401016020860160005b84811015615a8757601f198684030189526166e1838351614f34565b988401989250908301906001016166c5565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e085015261675b610180850183614f34565b915060408601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080868503016101008701526167988483614f34565b9350606088015191506167c461012087018373ffffffffffffffffffffffffffffffffffffffff169052565b60808801518387015260a08801519250808685030161016087015250506167eb82826165e1565b915050828103602084015261539f81856166a656fea164736f6c6343000818000a", } var OffRampABI = OffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go index f9e72dca96..614d720461 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 @@ -56,8 +56,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\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOutOfOrder\",\"type\":\"bool\"}],\"name\":\"OutOfOrderExecutionChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOutOfOrderExecution\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"outOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"setOutOfOrderExecution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200159d3803806200159d833981016040819052620000349162000263565b33806000846001600160a01b03811662000069576040516335fdcccd60e21b8152600060048201526024015b60405180910390fd5b6001600160a01b039081166080528216620000c75760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015260640162000060565b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000fa57620000fa816200019f565b50506002805460ff60a01b1916905550600380546001600160a01b0319166001600160a01b0383811691821790925560405163095ea7b360e01b8152918416600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001969190620002a2565b505050620002cd565b336001600160a01b03821603620001f95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b03811681146200026057600080fd5b50565b600080604083850312156200027757600080fd5b825162000284816200024a565b602084015190925062000297816200024a565b809150509250929050565b600060208284031215620002b557600080fd5b81518015158114620002c657600080fd5b9392505050565b6080516112a6620002f760003960008181610295015281816106860152610ab901526112a66000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638da5cb5b116100b2578063b187bd2611610081578063bee518a411610066578063bee518a4146102ef578063ca709a251461032d578063f2fde38b1461034b57600080fd5b8063b187bd26146102b9578063b5a11011146102dc57600080fd5b80638da5cb5b1461023f5780639d2aede51461025d578063ae90de5514610270578063b0f479a11461029357600080fd5b80632874d8bf11610109578063665ed537116100ee578063665ed5371461021157806379ba50971461022457806385572ffb1461022c57600080fd5b80632874d8bf146101ca5780632b6e5d63146101d257600080fd5b806301ffc9a71461013b57806316c38b3c14610163578063181f5a77146101785780631892b906146101b7575b600080fd5b61014e610149366004610cba565b61035e565b60405190151581526020015b60405180910390f35b610176610171366004610d03565b6103f7565b005b604080518082018252601281527f50696e67506f6e6744656d6f20312e352e3000000000000000000000000000006020820152905161015a9190610d89565b6101766101c5366004610db9565b610449565b6101766104a4565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b61017661021f366004610d03565b6104e0565b61017661056c565b61017661023a366004610dd4565b61066e565b60005473ffffffffffffffffffffffffffffffffffffffff166101ec565b61017661026b366004610e33565b6106f3565b60035474010000000000000000000000000000000000000000900460ff1661014e565b7f00000000000000000000000000000000000000000000000000000000000000006101ec565b60025474010000000000000000000000000000000000000000900460ff1661014e565b6101766102ea366004610e4e565b610742565b60015474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161015a565b60035473ffffffffffffffffffffffffffffffffffffffff166101ec565b610176610359366004610e33565b6107e4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb0000000000000000000000000000000000000000000000000000000014806103f157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6103ff6107f5565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104516107f5565b6001805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104ac6107f5565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556104de6001610876565b565b6104e86107f5565b6003805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd99061056190831515815260200190565b60405180910390a150565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106df576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024016105e9565b6106f06106eb82611084565b610b6f565b50565b6106fb6107f5565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61074a6107f5565b6001805467ffffffffffffffff90931674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909316929092179091556002805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b6107ec6107f5565b6106f081610bc5565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105e9565b806001166001036108b9576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16108ed565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6040805160a0810190915260025473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e0810160405160208183030381529060405281526020018360405160200161094591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052815260200160006040519080825280602002602001820160405280156109bf57816020015b60408051808201909152600080825260208201528152602001906001900390816109985790505b50815260035473ffffffffffffffffffffffffffffffffffffffff811660208084019190915260408051808201825262030d408082527401000000000000000000000000000000000000000090940460ff16151590830190815281516024810194909452511515604480850191909152815180850390910181526064909301815290820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf1000000000000000000000000000000000000000000000000000000000179052909101526001546040517f96f4e9f90000000000000000000000000000000000000000000000000000000081529192507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16916396f4e9f991610b27917401000000000000000000000000000000000000000090910467ffffffffffffffff16908590600401611131565b6020604051808303816000875af1158015610b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6a9190611246565b505050565b60008160600151806020019051810190610b899190611246565b60025490915074010000000000000000000000000000000000000000900460ff16610bc157610bc1610bbc82600161125f565b610876565b5050565b3373ffffffffffffffffffffffffffffffffffffffff821603610c44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105e9565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215610ccc57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610cfc57600080fd5b9392505050565b600060208284031215610d1557600080fd5b81358015158114610cfc57600080fd5b6000815180845260005b81811015610d4b57602081850181015186830182015201610d2f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610cfc6020830184610d25565b803567ffffffffffffffff81168114610db457600080fd5b919050565b600060208284031215610dcb57600080fd5b610cfc82610d9c565b600060208284031215610de657600080fd5b813567ffffffffffffffff811115610dfd57600080fd5b820160a08185031215610cfc57600080fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610db457600080fd5b600060208284031215610e4557600080fd5b610cfc82610e0f565b60008060408385031215610e6157600080fd5b610e6a83610d9c565b9150610e7860208401610e0f565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610ed357610ed3610e81565b60405290565b60405160a0810167ffffffffffffffff81118282101715610ed357610ed3610e81565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610f4357610f43610e81565b604052919050565b600082601f830112610f5c57600080fd5b813567ffffffffffffffff811115610f7657610f76610e81565b610fa760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610efc565b818152846020838601011115610fbc57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112610fea57600080fd5b8135602067ffffffffffffffff82111561100657611006610e81565b611014818360051b01610efc565b82815260069290921b8401810191818101908684111561103357600080fd5b8286015b8481101561107957604081890312156110505760008081fd5b611058610eb0565b61106182610e0f565b81528185013585820152835291830191604001611037565b509695505050505050565b600060a0823603121561109657600080fd5b61109e610ed9565b823581526110ae60208401610d9c565b6020820152604083013567ffffffffffffffff808211156110ce57600080fd5b6110da36838701610f4b565b604084015260608501359150808211156110f357600080fd5b6110ff36838701610f4b565b6060840152608085013591508082111561111857600080fd5b5061112536828601610fd9565b60808301525092915050565b6000604067ffffffffffffffff851683526020604081850152845160a0604086015261116060e0860182610d25565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261119b8383610d25565b6040890151888203830160808a01528051808352908601945060009350908501905b808410156111fc578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019390930192908601906111bd565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506112388187610d25565b9a9950505050505050505050565b60006020828403121561125857600080fd5b5051919050565b808201808211156103f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":false,\"internalType\":\"bool\",\"name\":\"isOutOfOrder\",\"type\":\"bool\"}],\"name\":\"OutOfOrderExecutionChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":[],\"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\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"name\":\"getOutOfOrderExecution\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"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\":\"bool\",\"name\":\"outOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"setOutOfOrderExecution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usePreFundedFeeTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPreFunded\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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: "0x60a06040523480156200001157600080fd5b5060405162004ccb38038062004ccb8339810160408190526200003491620005dc565b8181600182803380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000154565b5050506001600160a01b038116620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b031991821617909155600780549286169290911682179055821515608052159050620001495760025462000149906001600160a01b038481169116600019620001ff565b5050505050620006d9565b336001600160a01b03821603620001ae5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8015806200027d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027b91906200061b565b155b620002f15760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840162000088565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003499185916200034e16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200039d906001600160a01b0385169084906200041f565b805190915015620003495780806020019051810190620003be919062000635565b620003495760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000088565b606062000430848460008562000438565b949350505050565b6060824710156200049b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000088565b600080866001600160a01b03168587604051620004b9919062000686565b60006040518083038185875af1925050503d8060008114620004f8576040519150601f19603f3d011682016040523d82523d6000602084013e620004fd565b606091505b50909250905062000511878383876200051c565b979650505050505050565b606083156200059057825160000362000588576001600160a01b0385163b620005885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000088565b508162000430565b620004308383815115620005a75781518083602001fd5b8060405162461bcd60e51b8152600401620000889190620006a4565b6001600160a01b0381168114620005d957600080fd5b50565b60008060408385031215620005f057600080fd5b8251620005fd81620005c3565b60208401519092506200061081620005c3565b809150509250929050565b6000602082840312156200062e57600080fd5b5051919050565b6000602082840312156200064857600080fd5b815180151581146200065957600080fd5b9392505050565b60005b838110156200067d57818101518382015260200162000663565b50506000910152565b600082516200069a81846020870162000660565b9190910192915050565b6020815260008251806020840152620006c581604085016020870162000660565b601f01601f19169190910160400192915050565b6080516145cf620006fc600039600081816103c0015261232f01526145cf6000f3fe6080604052600436106101c65760003560e01c806385572ffb116100f7578063bee518a411610095578063cf6730f811610064578063cf6730f8146105e6578063e4ca875414610606578063e89b448514610626578063f2fde38b1461064757600080fd5b8063bee518a414610530578063c851cc321461057b578063c89245d51461059b578063ca709a25146105bb57600080fd5b8063ae90de55116100d1578063ae90de5514610484578063b0f479a1146104b5578063b187bd26146104e0578063b5a110111461051057600080fd5b806385572ffb146104195780638da5cb5b146104395780639fe74e261461046457600080fd5b80635e35359e116101645780636d62d6331161013e5780636d62d6331461039157806372be9eb8146103b157806379ba5097146103e45780638462a2b9146103f957600080fd5b80635e35359e14610324578063665ed537146103445780636939cd971461036457600080fd5b8063181f5a77116101a0578063181f5a77146102495780632874d8bf146102955780632b6e5d63146102aa57806335f170ef146102f657600080fd5b80630a9094dc146101d25780630e958d6b1461020757806316c38b3c1461022757600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed36600461333f565b610667565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506101f261022236600461336e565b61067a565b34801561023357600080fd5b50610247610242366004613401565b6106c5565b005b34801561025557600080fd5b50604080518082018252601681527f50696e67506f6e6744656d6f20312e362e302d64657600000000000000000000602082015290516101fe919061348c565b3480156102a157600080fd5b50610247610717565b3480156102b657600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b34801561030257600080fd5b5061031661031136600461349f565b610753565b6040516101fe9291906134bc565b34801561033057600080fd5b5061024761033f36600461350c565b61087f565b34801561035057600080fd5b5061024761035f366004613401565b610954565b34801561037057600080fd5b5061038461037f36600461333f565b610bea565b6040516101fe91906135aa565b34801561039d57600080fd5b506102476103ac36600461363e565b610df5565b3480156103bd57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006101f2565b3480156103f057600080fd5b5061024761100d565b34801561040557600080fd5b506102476104143660046136ba565b61110a565b34801561042557600080fd5b50610247610434366004613726565b61144b565b34801561044557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102d1565b34801561047057600080fd5b5061024761047f366004613761565b611642565b34801561049057600080fd5b506008547501000000000000000000000000000000000000000000900460ff166101f2565b3480156104c157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156104ec57600080fd5b5060085474010000000000000000000000000000000000000000900460ff166101f2565b34801561051c57600080fd5b5061024761052b3660046137a3565b6117fb565b34801561053c57600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b34801561058757600080fd5b506102476105963660046137d1565b611a03565b3480156105a757600080fd5b506102476105b63660046137d1565b611acf565b3480156105c757600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff166102d1565b3480156105f257600080fd5b50610247610601366004613726565b611c39565b34801561061257600080fd5b5061024761062136600461333f565b611dc4565b610639610634366004613923565b612092565b6040519081526020016101fe565b34801561065357600080fd5b506102476106623660046137d1565b6125cb565b60006106746005836125df565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906106a99085908590613a30565b9081526040519081900360200190205460ff1690509392505050565b6106cd6125fa565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61071f6125fa565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055610751600161267b565b565b60036020526000908152604090208054819061076e90613a40565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90613a40565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050908060010180546107fc90613a40565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613a40565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905082565b6108876125fa565b73ffffffffffffffffffffffffffffffffffffffff83166108c7576108c273ffffffffffffffffffffffffffffffffffffffff83168261279f565b6108e8565b6108e873ffffffffffffffffffffffffffffffffffffffff841683836128f9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e8360405161094791815260200190565b60405180910390a3505050565b61095c6125fa565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000831515021790556002546007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a589190613aa3565b905060008173ffffffffffffffffffffffffffffffffffffffff166306285c696040518163ffffffff1660e01b815260040161010060405180830381865afa158015610aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acc9190613ae7565b9050610b6e6040518060400160405280836060015167ffffffffffffffff1681526020018515158152506040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b60075474010000000000000000000000000000000000000000900467ffffffffffffffff16600090815260036020526040902060010190610baf9082613c01565b5060405183151581527f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd99060200160405180910390a1505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610c5990613a40565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8590613a40565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b50505050508152602001600382018054610ceb90613a40565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1790613a40565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610de75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610d92565b505050915250909392505050565b610dfd6125fa565b610e086005836125df565b610e46576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610ec75760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e72565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610f17600283018261328d565b610f2560038301600061328d565b610f336004830160006132c7565b50610f4190506005846129cd565b5060005b8151811015610fbb57610fb383838381518110610f6457610f64613d1b565b602002602001015160200151848481518110610f8257610f82613d1b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166128f99092919063ffffffff16565b600101610f45565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610e3d565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111126125fa565b60005b818110156112a5576003600084848481811061113357611133613d1b565b90506020028101906111459190613d4a565b61115390602081019061349f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061118a5761118a613d1b565b905060200281019061119c9190613d4a565b6111aa906020810190613d88565b6040516111b8929190613a30565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106111ff576111ff613d1b565b90506020028101906112119190613d4a565b61121f906020810190613d88565b60405161122d929190613a30565b604051809103902083838381811061124757611247613d1b565b90506020028101906112599190613d4a565b61126790602081019061349f565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a3600101611115565b5060005b83811015611444576001600360008787858181106112c9576112c9613d1b565b90506020028101906112db9190613d4a565b6112e990602081019061349f565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020186868481811061132057611320613d1b565b90506020028101906113329190613d4a565b611340906020810190613d88565b60405161134e929190613a30565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061139e5761139e613d1b565b90506020028101906113b09190613d4a565b6113be906020810190613d88565b6040516113cc929190613a30565b60405180910390208585838181106113e6576113e6613d1b565b90506020028101906113f89190613d4a565b61140690602081019061349f565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a36001016112a9565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461149e576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610e3d565b6114ae604082016020830161349f565b67ffffffffffffffff8116600090815260036020526040902080546114d290613a40565b9050600003611519576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610e3d565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890611555908590600401613eef565b600060405180830381600087803b15801561156f57600080fd5b505af1925050508015611580575060015b611612573d8080156115ae576040519150601f19603f3d011682016040523d82523d6000602084013e6115b3565b606091505b506115c0600584356129d9565b508235600090815260046020526040902083906115dd8282614279565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f9061100090849061348c565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b61164a6125fa565b60005b818110156117f657600083838381811061166957611669613d1b565b905060200281019061167b9190614373565b611684906143a7565b905080602001516116ef57805167ffffffffffffffff1660009081526003602052604081206116b29161328d565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a26117ed565b80604001515160000361172e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906117599082613c01565b506060810151815167ffffffffffffffff166000908152600360205260409020600101906117879082613c01565b50806040015160405161179a9190614458565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a8721283606001516040516117e4919061348c565b60405180910390a35b5060010161164d565b505050565b6118036125fa565b73ffffffffffffffffffffffffffffffffffffffff8116158061182e575067ffffffffffffffff8216155b15611865576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261195691614458565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff84166000908152600360205220906117f69082613c01565b611a0b6125fa565b73ffffffffffffffffffffffffffffffffffffffff8116611a58576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611ad76125fa565b60075473ffffffffffffffffffffffffffffffffffffffff1615611b3857611b38611b1760025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff169060006129e5565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611be557611be5611ba560025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b67565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611c72576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c82604082016020830161349f565b611c8f6040830183613d88565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611ce692509050613a40565b15905080611d3c5750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611d279190614458565b9081526040519081900360200190205460ff16155b15611d7557806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610e3d919061348c565b60085474010000000000000000000000000000000000000000900460ff166117f6576117f6611da76060850185613d88565b810190611db4919061333f565b611dbf90600161446a565b61267b565b611dcf6005826125df565b611e08576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610e3d565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff16938101939093526002810180549192840191611e4f90613a40565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b90613a40565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b50505050508152602001600382018054611ee190613a40565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0d90613a40565b8015611f5a5780601f10611f2f57610100808354040283529160200191611f5a565b820191906000526020600020905b815481529060010190602001808311611f3d57829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611fdd5760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101611f88565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905591925061202f600283018261328d565b61203d60038301600061328d565b61204b6004830160006132c7565b5061205990506005836129cd565b5061206381612c6b565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff8316600090815260036020526040812080548591906120b990613a40565b9050600003612100576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610e3d565b6040805160a08101825267ffffffffffffffff871660009081526003602052918220805482919061213090613a40565b80601f016020809104026020016040519081016040528092919081815260200182805461215c90613a40565b80156121a95780601f1061217e576101008083540402835291602001916121a9565b820191906000526020600020905b81548152906001019060200180831161218c57829003601f168201915b50505091835250506020808201879052604080830189905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8a16600090815260039092529020600101805460809092019161220a90613a40565b80601f016020809104026020016040519081016040528092919081815260200182805461223690613a40565b80156122835780601f1061225857610100808354040283529160200191612283565b820191906000526020600020905b81548152906001019060200180831161226657829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded906122ea908a90869060040161447d565b602060405180830381865afa158015612307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232b919061454a565b90507f0000000000000000000000000000000000000000000000000000000000000000158015612372575060075473ffffffffffffffffffffffffffffffffffffffff1615155b1561239c5760075461239c9073ffffffffffffffffffffffffffffffffffffffff16333084612cdd565b60005b86518110156124ef5761240f33308984815181106123bf576123bf613d1b565b6020026020010151602001518a85815181106123dd576123dd613d1b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612cdd909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff9091169088908390811061243f5761243f613d1b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16146124e75760025487516124e79173ffffffffffffffffffffffffffffffffffffffff169089908490811061249857612498613d1b565b6020026020010151602001518984815181106124b6576124b6613d1b565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166129e59092919063ffffffff16565b60010161239f565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f9911615612522576000612524565b825b89856040518463ffffffff1660e01b815260040161254392919061447d565b60206040518083038185885af1158015612561573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612586919061454a565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a846040516125b991815260200190565b60405180910390a15050509392505050565b6125d36125fa565b6125dc81612d3b565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610e3d565b806001166001036126be576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a16126f2565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b60008160405160200161270791815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181526007546000808552602085019093529093506117f6927401000000000000000000000000000000000000000090910467ffffffffffffffff1691612798565b60408051808201909152600080825260208201528152602001906001900390816127715790505b5083612092565b80471015612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e3d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612863576040519150601f19603f3d011682016040523d82523d6000602084013e612868565b606091505b50509050806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e3d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117f69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e30565b60006125f38383612f3c565b60006125f3838361302f565b801580612a8557506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a83919061454a565b155b612b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e3d565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526117f69084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161294b565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c02919061454a565b612c0c919061446a565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150612c659085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161294b565b50505050565b612c736125fa565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f890612caf9084906004016135aa565b600060405180830381600087803b158015612cc957600080fd5b505af1158015611444573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612c659085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161294b565b3373ffffffffffffffffffffffffffffffffffffffff821603612dba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610e3d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612e92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661307e9092919063ffffffff16565b8051909150156117f65780806020019051810190612eb09190614563565b6117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e3d565b60008181526001830160205260408120548015613025576000612f60600183614580565b8554909150600090612f7490600190614580565b9050818114612fd9576000866000018281548110612f9457612f94613d1b565b9060005260206000200154905080876000018481548110612fb757612fb7613d1b565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612fea57612fea614593565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610674565b6000915050610674565b600081815260018301602052604081205461307657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610674565b506000610674565b606061308d8484600085613095565b949350505050565b606082471015613127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e3d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131509190614458565b60006040518083038185875af1925050503d806000811461318d576040519150601f19603f3d011682016040523d82523d6000602084013e613192565b606091505b50915091506131a3878383876131ae565b979650505050505050565b6060831561324457825160000361323d5773ffffffffffffffffffffffffffffffffffffffff85163b61323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e3d565b508161308d565b61308d83838151156132595781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d919061348c565b50805461329990613a40565b6000825580601f106132a9575050565b601f0160209004906000526020600020908101906125dc91906132e8565b50805460008255600202906000526020600020908101906125dc9190613301565b5b808211156132fd57600081556001016132e9565b5090565b5b808211156132fd5780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613302565b60006020828403121561335157600080fd5b5035919050565b67ffffffffffffffff811681146125dc57600080fd5b60008060006040848603121561338357600080fd5b833561338e81613358565b9250602084013567ffffffffffffffff808211156133ab57600080fd5b818601915086601f8301126133bf57600080fd5b8135818111156133ce57600080fd5b8760208285010111156133e057600080fd5b6020830194508093505050509250925092565b80151581146125dc57600080fd5b60006020828403121561341357600080fd5b81356125f3816133f3565b60005b83811015613439578181015183820152602001613421565b50506000910152565b6000815180845261345a81602086016020860161341e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006125f36020830184613442565b6000602082840312156134b157600080fd5b81356125f381613358565b6040815260006134cf6040830185613442565b82810360208401526134e18185613442565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146125dc57600080fd5b60008060006060848603121561352157600080fd5b833561352c816134ea565b9250602084013561353c816134ea565b929592945050506040919091013590565b60008151808452602080850194506020840160005b8381101561359f578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613562565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a060608401526135e460c0840182613442565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160808601526136208383613442565b925060808601519150808584030160a0860152506134e1828261354d565b6000806040838503121561365157600080fd5b823591506020830135613663816134ea565b809150509250929050565b60008083601f84011261368057600080fd5b50813567ffffffffffffffff81111561369857600080fd5b6020830191508360208260051b85010111156136b357600080fd5b9250929050565b600080600080604085870312156136d057600080fd5b843567ffffffffffffffff808211156136e857600080fd5b6136f48883890161366e565b9096509450602087013591508082111561370d57600080fd5b5061371a8782880161366e565b95989497509550505050565b60006020828403121561373857600080fd5b813567ffffffffffffffff81111561374f57600080fd5b820160a081850312156125f357600080fd5b6000806020838503121561377457600080fd5b823567ffffffffffffffff81111561378b57600080fd5b6137978582860161366e565b90969095509350505050565b600080604083850312156137b657600080fd5b82356137c181613358565b91506020830135613663816134ea565b6000602082840312156137e357600080fd5b81356125f3816134ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613840576138406137ee565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561388d5761388d6137ee565b604052919050565b600082601f8301126138a657600080fd5b813567ffffffffffffffff8111156138c0576138c06137ee565b6138f160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613846565b81815284602083860101111561390657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561393857600080fd5b833561394381613358565b925060208481013567ffffffffffffffff8082111561396157600080fd5b818701915087601f83011261397557600080fd5b813581811115613987576139876137ee565b613995848260051b01613846565b81815260069190911b8301840190848101908a8311156139b457600080fd5b938501935b82851015613a00576040858c0312156139d25760008081fd5b6139da61381d565b85356139e5816134ea565b815285870135878201528252604090940193908501906139b9565b965050506040870135925080831115613a1857600080fd5b5050613a2686828701613895565b9150509250925092565b8183823760009101908152919050565b600181811c90821680613a5457607f821691505b602082108103613a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8051613a9e816134ea565b919050565b600060208284031215613ab557600080fd5b81516125f3816134ea565b8051613a9e81613358565b80516bffffffffffffffffffffffff81168114613a9e57600080fd5b6000610100808385031215613afb57600080fd5b6040519081019067ffffffffffffffff82118183101715613b1e57613b1e6137ee565b8160405283519150613b2f826134ea565b818152613b3e60208501613ac0565b6020820152613b4f60408501613ac0565b6040820152613b6060608501613ac0565b6060820152613b7160808501613acb565b6080820152613b8260a08501613a93565b60a0820152613b9360c08501613a93565b60c0820152613ba460e08501613a93565b60e0820152949350505050565b601f8211156117f6576000816000526020600020601f850160051c81016020861015613bda5750805b601f850160051c820191505b81811015613bf957828155600101613be6565b505050505050565b815167ffffffffffffffff811115613c1b57613c1b6137ee565b613c2f81613c298454613a40565b84613bb1565b602080601f831160018114613c825760008415613c4c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613bf9565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613ccf57888601518255948401946001909101908401613cb0565b5085821015613d0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613d7e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613dbd57600080fd5b83018035915067ffffffffffffffff821115613dd857600080fd5b6020019150368190038213156136b357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e2257600080fd5b830160208101925035905067ffffffffffffffff811115613e4257600080fd5b8036038213156136b357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561359f578135613ebd816134ea565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101613eaa565b602081528135602082015260006020830135613f0a81613358565b67ffffffffffffffff8082166040850152613f286040860186613ded565b925060a06060860152613f3f60c086018483613e51565b925050613f4f6060860186613ded565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080878603016080880152613f85858385613e51565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312613fbe57600080fd5b60209288019283019235915083821115613fd757600080fd5b8160061b3603831315613fe957600080fd5b8685030160a08701526131a3848284613e9a565b67ffffffffffffffff831115614015576140156137ee565b614029836140238354613a40565b83613bb1565b6000601f84116001811461407b57600085156140455750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611444565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140ca57868501358255602094850194600190920191016140aa565b5086821015614105577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8135614151816134ea565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b680100000000000000008311156141b7576141b76137ee565b8054838255808410156142445760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831683146141f8576141f8614117565b808616861461420957614209614117565b5060008360005260206000208360011b81018760011b820191505b8082101561423f578282558284830155600282019150614224565b505050505b5060008181526020812083915b85811015613bf9576142638383614146565b6040929092019160029190910190600101614251565b8135815560018101602083013561428f81613358565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008454161783556142cf6040860186613d88565b935091506142e1838360028701613ffd565b6142ee6060860186613d88565b93509150614300838360038701613ffd565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261433757600080fd5b91840191823591508082111561434c57600080fd5b506020820191508060061b360382131561436557600080fd5b612c6581836004860161419e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d7e57600080fd5b6000608082360312156143b957600080fd5b6040516080810167ffffffffffffffff82821081831117156143dd576143dd6137ee565b81604052843591506143ee82613358565b908252602084013590614400826133f3565b816020840152604085013591508082111561441a57600080fd5b61442636838701613895565b6040840152606085013591508082111561443f57600080fd5b5061444c36828601613895565b60608301525092915050565b60008251613d7e81846020870161341e565b8082018082111561067457610674614117565b67ffffffffffffffff83168152604060208201526000825160a060408401526144a960e0840182613442565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808584030160608601526144e58383613442565b92506040860151915080858403016080860152614502838361354d565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506145408282613442565b9695505050505050565b60006020828403121561455c57600080fd5b5051919050565b60006020828403121561457557600080fd5b81516125f3816133f3565b8181038181111561067457610674614117565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var PingPongDemoABI = PingPongDemoMetaData.ABI @@ -262,6 +262,28 @@ func (_PingPongDemo *PingPongDemoCallerSession) GetFeeToken() (common.Address, e return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) } +func (_PingPongDemo *PingPongDemoCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { + var out []interface{} + err := _PingPongDemo.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 (_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) GetOutOfOrderExecution(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _PingPongDemo.contract.Call(opts, &out, "getOutOfOrderExecution") @@ -564,30 +586,6 @@ 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 *PingPongDemoSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, addr) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, addr) -} - -func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.contract.Transact(opts, "setCounterpartChainSelector", chainSelector) -} - -func (_PingPongDemo *PingPongDemoSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, chainSelector) -} - -func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, chainSelector) -} - func (_PingPongDemo *PingPongDemoTransactor) SetOutOfOrderExecution(opts *bind.TransactOpts, outOfOrderExecution bool) (*types.Transaction, error) { return _PingPongDemo.contract.Transact(opts, "setOutOfOrderExecution", outOfOrderExecution) } @@ -636,8 +634,68 @@ func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common. return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) } -type PingPongDemoOutOfOrderExecutionChangeIterator struct { - Event *PingPongDemoOutOfOrderExecutionChange +func (_PingPongDemo *PingPongDemoTransactor) UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateApprovedSenders", adds, removes) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateApprovedSenders(adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateApprovedSenders(&_PingPongDemo.TransactOpts, adds, removes) +} + +func (_PingPongDemo *PingPongDemoTransactor) UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateFeeToken", token) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateFeeToken(&_PingPongDemo.TransactOpts, token) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateFeeToken(token common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateFeeToken(&_PingPongDemo.TransactOpts, token) +} + +func (_PingPongDemo *PingPongDemoTransactor) UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "updateRouter", newRouter) +} + +func (_PingPongDemo *PingPongDemoSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateRouter(&_PingPongDemo.TransactOpts, newRouter) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) UpdateRouter(newRouter common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.UpdateRouter(&_PingPongDemo.TransactOpts, newRouter) +} + +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) 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 PingPongDemoApprovedSenderAddedIterator struct { + Event *PingPongDemoApprovedSenderAdded contract *bind.BoundContract event string @@ -648,7 +706,7 @@ type PingPongDemoOutOfOrderExecutionChangeIterator struct { fail error } -func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Next() bool { +func (it *PingPongDemoApprovedSenderAddedIterator) Next() bool { if it.fail != nil { return false @@ -657,7 +715,7 @@ func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoOutOfOrderExecutionChange) + it.Event = new(PingPongDemoApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -672,7 +730,7 @@ func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoOutOfOrderExecutionChange) + it.Event = new(PingPongDemoApprovedSenderAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -687,32 +745,51 @@ func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Next() bool { } } -func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Error() error { +func (it *PingPongDemoApprovedSenderAddedIterator) Error() error { return it.fail } -func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Close() error { +func (it *PingPongDemoApprovedSenderAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoOutOfOrderExecutionChange struct { - IsOutOfOrder bool - Raw types.Log +type PingPongDemoApprovedSenderAdded struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*PingPongDemoOutOfOrderExecutionChangeIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderAddedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OutOfOrderExecutionChange") + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &PingPongDemoOutOfOrderExecutionChangeIterator{contract: _PingPongDemo.contract, event: "OutOfOrderExecutionChange", logs: logs, sub: sub}, nil + return &PingPongDemoApprovedSenderAddedIterator{contract: _PingPongDemo.contract, event: "ApprovedSenderAdded", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *PingPongDemoOutOfOrderExecutionChange) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OutOfOrderExecutionChange") + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ApprovedSenderAdded", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -722,8 +799,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchOutOfOrderExecutionChange(opts * select { case log := <-logs: - event := new(PingPongDemoOutOfOrderExecutionChange) - if err := _PingPongDemo.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { + event := new(PingPongDemoApprovedSenderAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return err } event.Raw = log @@ -744,17 +821,17 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchOutOfOrderExecutionChange(opts * }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParseOutOfOrderExecutionChange(log types.Log) (*PingPongDemoOutOfOrderExecutionChange, error) { - event := new(PingPongDemoOutOfOrderExecutionChange) - if err := _PingPongDemo.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseApprovedSenderAdded(log types.Log) (*PingPongDemoApprovedSenderAdded, error) { + event := new(PingPongDemoApprovedSenderAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoOwnershipTransferRequestedIterator struct { - Event *PingPongDemoOwnershipTransferRequested +type PingPongDemoApprovedSenderRemovedIterator struct { + Event *PingPongDemoApprovedSenderRemoved contract *bind.BoundContract event string @@ -765,7 +842,7 @@ type PingPongDemoOwnershipTransferRequestedIterator struct { fail error } -func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { +func (it *PingPongDemoApprovedSenderRemovedIterator) Next() bool { if it.fail != nil { return false @@ -774,7 +851,7 @@ func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferRequested) + it.Event = new(PingPongDemoApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -789,7 +866,7 @@ func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferRequested) + it.Event = new(PingPongDemoApprovedSenderRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -804,51 +881,51 @@ func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { } } -func (it *PingPongDemoOwnershipTransferRequestedIterator) Error() error { +func (it *PingPongDemoApprovedSenderRemovedIterator) Error() error { return it.fail } -func (it *PingPongDemoOwnershipTransferRequestedIterator) Close() error { +func (it *PingPongDemoApprovedSenderRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log +type PingPongDemoApprovedSenderRemoved struct { + DestChainSelector uint64 + Recipient common.Hash + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferRequestedIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderRemovedIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &PingPongDemoOwnershipTransferRequestedIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil + return &PingPongDemoApprovedSenderRemovedIterator{contract: _PingPongDemo.contract, event: "ApprovedSenderRemoved", 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) WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ApprovedSenderRemoved", destChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -858,8 +935,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(PingPongDemoApprovedSenderRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return err } event.Raw = log @@ -880,17 +957,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) ParseApprovedSenderRemoved(log types.Log) (*PingPongDemoApprovedSenderRemoved, error) { + event := new(PingPongDemoApprovedSenderRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ApprovedSenderRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoOwnershipTransferredIterator struct { - Event *PingPongDemoOwnershipTransferred +type PingPongDemoCCIPRouterModifiedIterator struct { + Event *PingPongDemoCCIPRouterModified contract *bind.BoundContract event string @@ -901,7 +978,7 @@ type PingPongDemoOwnershipTransferredIterator struct { fail error } -func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { +func (it *PingPongDemoCCIPRouterModifiedIterator) Next() bool { if it.fail != nil { return false @@ -910,7 +987,7 @@ func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferred) + it.Event = new(PingPongDemoCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -925,7 +1002,7 @@ func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoOwnershipTransferred) + it.Event = new(PingPongDemoCCIPRouterModified) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -940,51 +1017,51 @@ func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { } } -func (it *PingPongDemoOwnershipTransferredIterator) Error() error { +func (it *PingPongDemoCCIPRouterModifiedIterator) Error() error { return it.fail } -func (it *PingPongDemoOwnershipTransferredIterator) Close() error { +func (it *PingPongDemoCCIPRouterModifiedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoOwnershipTransferred struct { - From common.Address - To common.Address - Raw types.Log +type PingPongDemoCCIPRouterModified struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferredIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*PingPongDemoCCIPRouterModifiedIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) } - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } - return &PingPongDemoOwnershipTransferredIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &PingPongDemoCCIPRouterModifiedIterator{contract: _PingPongDemo.contract, event: "CCIPRouterModified", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) + var oldRouterRule []interface{} + for _, oldRouterItem := range oldRouter { + oldRouterRule = append(oldRouterRule, oldRouterItem) } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var newRouterRule []interface{} + for _, newRouterItem := range newRouter { + newRouterRule = append(newRouterRule, newRouterItem) } - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "CCIPRouterModified", oldRouterRule, newRouterRule) if err != nil { return nil, err } @@ -994,8 +1071,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(PingPongDemoCCIPRouterModified) + if err := _PingPongDemo.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return err } event.Raw = log @@ -1016,17 +1093,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) ParseCCIPRouterModified(log types.Log) (*PingPongDemoCCIPRouterModified, error) { + event := new(PingPongDemoCCIPRouterModified) + if err := _PingPongDemo.contract.UnpackLog(event, "CCIPRouterModified", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoPingIterator struct { - Event *PingPongDemoPing +type PingPongDemoChainAddedIterator struct { + Event *PingPongDemoChainAdded contract *bind.BoundContract event string @@ -1037,7 +1114,7 @@ type PingPongDemoPingIterator struct { fail error } -func (it *PingPongDemoPingIterator) Next() bool { +func (it *PingPongDemoChainAddedIterator) Next() bool { if it.fail != nil { return false @@ -1046,7 +1123,7 @@ func (it *PingPongDemoPingIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoPing) + it.Event = new(PingPongDemoChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1061,7 +1138,7 @@ func (it *PingPongDemoPingIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoPing) + it.Event = new(PingPongDemoChainAdded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1076,32 +1153,52 @@ func (it *PingPongDemoPingIterator) Next() bool { } } -func (it *PingPongDemoPingIterator) Error() error { +func (it *PingPongDemoChainAddedIterator) Error() error { return it.fail } -func (it *PingPongDemoPingIterator) Close() error { +func (it *PingPongDemoChainAddedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoPing struct { - PingPongCount *big.Int - Raw types.Log +type PingPongDemoChainAdded struct { + RemoteChainSelector uint64 + Recipient common.Hash + ExtraArgsBytes []byte + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterPing(opts *bind.FilterOpts) (*PingPongDemoPingIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*PingPongDemoChainAddedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Ping") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } - return &PingPongDemoPingIterator{contract: _PingPongDemo.contract, event: "Ping", logs: logs, sub: sub}, nil + return &PingPongDemoChainAddedIterator{contract: _PingPongDemo.contract, event: "ChainAdded", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchPing(opts *bind.WatchOpts, sink chan<- *PingPongDemoPing) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Ping") + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainAdded", remoteChainSelectorRule, recipientRule) if err != nil { return nil, err } @@ -1111,8 +1208,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(PingPongDemoChainAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainAdded", log); err != nil { return err } event.Raw = log @@ -1133,17 +1230,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) ParseChainAdded(log types.Log) (*PingPongDemoChainAdded, error) { + event := new(PingPongDemoChainAdded) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainAdded", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoPongIterator struct { - Event *PingPongDemoPong +type PingPongDemoChainRemovedIterator struct { + Event *PingPongDemoChainRemoved contract *bind.BoundContract event string @@ -1154,7 +1251,7 @@ type PingPongDemoPongIterator struct { fail error } -func (it *PingPongDemoPongIterator) Next() bool { +func (it *PingPongDemoChainRemovedIterator) Next() bool { if it.fail != nil { return false @@ -1163,7 +1260,7 @@ func (it *PingPongDemoPongIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoPong) + it.Event = new(PingPongDemoChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1178,7 +1275,7 @@ func (it *PingPongDemoPongIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoPong) + it.Event = new(PingPongDemoChainRemoved) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1193,32 +1290,42 @@ func (it *PingPongDemoPongIterator) Next() bool { } } -func (it *PingPongDemoPongIterator) Error() error { +func (it *PingPongDemoChainRemovedIterator) Error() error { return it.fail } -func (it *PingPongDemoPongIterator) Close() error { +func (it *PingPongDemoChainRemovedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoPong struct { - PingPongCount *big.Int - Raw types.Log +type PingPongDemoChainRemoved struct { + RemoveChainSelector uint64 + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterPong(opts *bind.FilterOpts) (*PingPongDemoPongIterator, error) { +func (_PingPongDemo *PingPongDemoFilterer) FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*PingPongDemoChainRemovedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Pong") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } - return &PingPongDemoPongIterator{contract: _PingPongDemo.contract, event: "Pong", logs: logs, sub: sub}, nil + return &PingPongDemoChainRemovedIterator{contract: _PingPongDemo.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchPong(opts *bind.WatchOpts, sink chan<- *PingPongDemoPong) (event.Subscription, error) { +func (_PingPongDemo *PingPongDemoFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved, removeChainSelector []uint64) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Pong") + var removeChainSelectorRule []interface{} + for _, removeChainSelectorItem := range removeChainSelector { + removeChainSelectorRule = append(removeChainSelectorRule, removeChainSelectorItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "ChainRemoved", removeChainSelectorRule) if err != nil { return nil, err } @@ -1228,8 +1335,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchPong(opts *bind.WatchOpts, sink select { case log := <-logs: - event := new(PingPongDemoPong) - if err := _PingPongDemo.contract.UnpackLog(event, "Pong", log); err != nil { + event := new(PingPongDemoChainRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return err } event.Raw = log @@ -1250,17 +1357,17 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchPong(opts *bind.WatchOpts, sink }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDemoPong, error) { - event := new(PingPongDemoPong) - if err := _PingPongDemo.contract.UnpackLog(event, "Pong", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, error) { + event := new(PingPongDemoChainRemoved) + if err := _PingPongDemo.contract.UnpackLog(event, "ChainRemoved", log); err != nil { return nil, err } event.Raw = log return event, nil } -type PingPongDemoTokensWithdrawnByOwnerIterator struct { - Event *PingPongDemoTokensWithdrawnByOwner +type PingPongDemoFeeTokenUpdatedIterator struct { + Event *PingPongDemoFeeTokenUpdated contract *bind.BoundContract event string @@ -1271,7 +1378,7 @@ type PingPongDemoTokensWithdrawnByOwnerIterator struct { fail error } -func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Next() bool { +func (it *PingPongDemoFeeTokenUpdatedIterator) Next() bool { if it.fail != nil { return false @@ -1280,7 +1387,7 @@ func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PingPongDemoTokensWithdrawnByOwner) + it.Event = new(PingPongDemoFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1295,7 +1402,7 @@ func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(PingPongDemoTokensWithdrawnByOwner) + it.Event = new(PingPongDemoFeeTokenUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1310,52 +1417,33 @@ func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Next() bool { } } -func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Error() error { +func (it *PingPongDemoFeeTokenUpdatedIterator) Error() error { return it.fail } -func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Close() error { +func (it *PingPongDemoFeeTokenUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -type PingPongDemoTokensWithdrawnByOwner struct { - Token common.Address - To common.Address - Amount *big.Int - Raw types.Log +type PingPongDemoFeeTokenUpdated struct { + OldFeeToken common.Address + NewFeeToken common.Address + Raw types.Log } -func (_PingPongDemo *PingPongDemoFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*PingPongDemoTokensWithdrawnByOwnerIterator, error) { - - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } +func (_PingPongDemo *PingPongDemoFilterer) FilterFeeTokenUpdated(opts *bind.FilterOpts) (*PingPongDemoFeeTokenUpdatedIterator, error) { - logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "FeeTokenUpdated") if err != nil { return nil, err } - return &PingPongDemoTokensWithdrawnByOwnerIterator{contract: _PingPongDemo.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil + return &PingPongDemoFeeTokenUpdatedIterator{contract: _PingPongDemo.contract, event: "FeeTokenUpdated", logs: logs, sub: sub}, nil } -func (_PingPongDemo *PingPongDemoFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *PingPongDemoTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { - - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } +func (_PingPongDemo *PingPongDemoFilterer) WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated) (event.Subscription, error) { - logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "FeeTokenUpdated") if err != nil { return nil, err } @@ -1365,8 +1453,8 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchTokensWithdrawnByOwner(opts *bin select { case log := <-logs: - event := new(PingPongDemoTokensWithdrawnByOwner) - if err := _PingPongDemo.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + event := new(PingPongDemoFeeTokenUpdated) + if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return err } event.Raw = log @@ -1387,25 +1475,1434 @@ func (_PingPongDemo *PingPongDemoFilterer) WatchTokensWithdrawnByOwner(opts *bin }), nil } -func (_PingPongDemo *PingPongDemoFilterer) ParseTokensWithdrawnByOwner(log types.Log) (*PingPongDemoTokensWithdrawnByOwner, error) { - event := new(PingPongDemoTokensWithdrawnByOwner) - if err := _PingPongDemo.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { +func (_PingPongDemo *PingPongDemoFilterer) ParseFeeTokenUpdated(log types.Log) (*PingPongDemoFeeTokenUpdated, error) { + event := new(PingPongDemoFeeTokenUpdated) + if err := _PingPongDemo.contract.UnpackLog(event, "FeeTokenUpdated", log); err != nil { return nil, err } event.Raw = log return event, nil } -type SChainConfigs struct { - Recipient []byte - ExtraArgsBytes []byte +type PingPongDemoMessageAbandonedIterator struct { + Event *PingPongDemoMessageAbandoned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, error) { - switch log.Topics[0] { - case _PingPongDemo.abi.Events["OutOfOrderExecutionChange"].ID: - return _PingPongDemo.ParseOutOfOrderExecutionChange(log) - case _PingPongDemo.abi.Events["OwnershipTransferRequested"].ID: +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 PingPongDemoMessageFailedIterator struct { + Event *PingPongDemoMessageFailed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoMessageFailedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoMessageFailed) + 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(PingPongDemoMessageFailed) + 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 *PingPongDemoMessageFailedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoMessageFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log +} + +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 { + MessageId [32]byte + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterMessageSent(opts *bind.FilterOpts) (*PingPongDemoMessageSentIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "MessageSent") + 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) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.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(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 PingPongDemoOutOfOrderExecutionChangeIterator struct { + Event *PingPongDemoOutOfOrderExecutionChange + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOutOfOrderExecutionChange) + 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(PingPongDemoOutOfOrderExecutionChange) + 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 *PingPongDemoOutOfOrderExecutionChangeIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoOutOfOrderExecutionChange struct { + IsOutOfOrder bool + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*PingPongDemoOutOfOrderExecutionChangeIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OutOfOrderExecutionChange") + if err != nil { + return nil, err + } + return &PingPongDemoOutOfOrderExecutionChangeIterator{contract: _PingPongDemo.contract, event: "OutOfOrderExecutionChange", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *PingPongDemoOutOfOrderExecutionChange) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OutOfOrderExecutionChange") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoOutOfOrderExecutionChange) + if err := _PingPongDemo.contract.UnpackLog(event, "OutOfOrderExecutionChange", 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) ParseOutOfOrderExecutionChange(log types.Log) (*PingPongDemoOutOfOrderExecutionChange, error) { + event := new(PingPongDemoOutOfOrderExecutionChange) + if err := _PingPongDemo.contract.UnpackLog(event, "OutOfOrderExecutionChange", 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 { + return nil, err + } + return &PingPongDemoPongIterator{contract: _PingPongDemo.contract, event: "Pong", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchPong(opts *bind.WatchOpts, sink chan<- *PingPongDemoPong) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Pong") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoPong) + if err := _PingPongDemo.contract.UnpackLog(event, "Pong", 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) ParsePong(log types.Log) (*PingPongDemoPong, error) { + event := new(PingPongDemoPong) + if err := _PingPongDemo.contract.UnpackLog(event, "Pong", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoTokensWithdrawnByOwnerIterator struct { + Event *PingPongDemoTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoTokensWithdrawnByOwner) + 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(PingPongDemoTokensWithdrawnByOwner) + 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 *PingPongDemoTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*PingPongDemoTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &PingPongDemoTokensWithdrawnByOwnerIterator{contract: _PingPongDemo.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *PingPongDemoTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(PingPongDemoTokensWithdrawnByOwner) + if err := _PingPongDemo.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*PingPongDemoTokensWithdrawnByOwner, error) { + event := new(PingPongDemoTokensWithdrawnByOwner) + if err := _PingPongDemo.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChainConfigs struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _PingPongDemo.abi.Events["ApprovedSenderAdded"].ID: + return _PingPongDemo.ParseApprovedSenderAdded(log) + case _PingPongDemo.abi.Events["ApprovedSenderRemoved"].ID: + return _PingPongDemo.ParseApprovedSenderRemoved(log) + case _PingPongDemo.abi.Events["CCIPRouterModified"].ID: + return _PingPongDemo.ParseCCIPRouterModified(log) + case _PingPongDemo.abi.Events["ChainAdded"].ID: + return _PingPongDemo.ParseChainAdded(log) + case _PingPongDemo.abi.Events["ChainRemoved"].ID: + return _PingPongDemo.ParseChainRemoved(log) + case _PingPongDemo.abi.Events["FeeTokenUpdated"].ID: + return _PingPongDemo.ParseFeeTokenUpdated(log) + case _PingPongDemo.abi.Events["MessageAbandoned"].ID: + return _PingPongDemo.ParseMessageAbandoned(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["OutOfOrderExecutionChange"].ID: + return _PingPongDemo.ParseOutOfOrderExecutionChange(log) + case _PingPongDemo.abi.Events["OwnershipTransferRequested"].ID: return _PingPongDemo.ParseOwnershipTransferRequested(log) case _PingPongDemo.abi.Events["OwnershipTransferred"].ID: return _PingPongDemo.ParseOwnershipTransferred(log) @@ -1421,6 +2918,50 @@ func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, } } +func (PingPongDemoApprovedSenderAdded) Topic() common.Hash { + return common.HexToHash("0x72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e7") +} + +func (PingPongDemoApprovedSenderRemoved) Topic() common.Hash { + return common.HexToHash("0x021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce9") +} + +func (PingPongDemoCCIPRouterModified) Topic() common.Hash { + return common.HexToHash("0x3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c8") +} + +func (PingPongDemoChainAdded) Topic() common.Hash { + return common.HexToHash("0x1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a87212") +} + +func (PingPongDemoChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (PingPongDemoFeeTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67") +} + +func (PingPongDemoMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + +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("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") +} + +func (PingPongDemoMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + func (PingPongDemoOutOfOrderExecutionChange) Topic() common.Hash { return common.HexToHash("0x05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd9") } @@ -1456,6 +2997,8 @@ type PingPongDemoInterface interface { GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + GetOutOfOrderExecution(opts *bind.CallOpts) (bool, error) GetRouter(opts *bind.CallOpts) (common.Address, error) @@ -1492,10 +3035,6 @@ type PingPongDemoInterface interface { SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) - - SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) - SetOutOfOrderExecution(opts *bind.TransactOpts, outOfOrderExecution bool) (*types.Transaction, error) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) @@ -1504,6 +3043,82 @@ type PingPongDemoInterface interface { TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + UpdateApprovedSenders(opts *bind.TransactOpts, adds []CCIPBaseApprovedSenderUpdate, removes []CCIPBaseApprovedSenderUpdate) (*types.Transaction, error) + + UpdateFeeToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + UpdateRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + WithdrawTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + Receive(opts *bind.TransactOpts) (*types.Transaction, error) + + FilterApprovedSenderAdded(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderAddedIterator, error) + + WatchApprovedSenderAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderAdded, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderAdded(log types.Log) (*PingPongDemoApprovedSenderAdded, error) + + FilterApprovedSenderRemoved(opts *bind.FilterOpts, destChainSelector []uint64, recipient [][]byte) (*PingPongDemoApprovedSenderRemovedIterator, error) + + WatchApprovedSenderRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoApprovedSenderRemoved, destChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseApprovedSenderRemoved(log types.Log) (*PingPongDemoApprovedSenderRemoved, error) + + FilterCCIPRouterModified(opts *bind.FilterOpts, oldRouter []common.Address, newRouter []common.Address) (*PingPongDemoCCIPRouterModifiedIterator, error) + + WatchCCIPRouterModified(opts *bind.WatchOpts, sink chan<- *PingPongDemoCCIPRouterModified, oldRouter []common.Address, newRouter []common.Address) (event.Subscription, error) + + ParseCCIPRouterModified(log types.Log) (*PingPongDemoCCIPRouterModified, error) + + FilterChainAdded(opts *bind.FilterOpts, remoteChainSelector []uint64, recipient [][]byte) (*PingPongDemoChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainAdded, remoteChainSelector []uint64, recipient [][]byte) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*PingPongDemoChainAdded, error) + + FilterChainRemoved(opts *bind.FilterOpts, removeChainSelector []uint64) (*PingPongDemoChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *PingPongDemoChainRemoved, removeChainSelector []uint64) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*PingPongDemoChainRemoved, error) + + FilterFeeTokenUpdated(opts *bind.FilterOpts) (*PingPongDemoFeeTokenUpdatedIterator, error) + + WatchFeeTokenUpdated(opts *bind.WatchOpts, sink chan<- *PingPongDemoFeeTokenUpdated) (event.Subscription, error) + + ParseFeeTokenUpdated(log types.Log) (*PingPongDemoFeeTokenUpdated, 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) + + 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) (*PingPongDemoMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *PingPongDemoMessageSent) (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) + FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*PingPongDemoOutOfOrderExecutionChangeIterator, error) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *PingPongDemoOutOfOrderExecutionChange) (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 34fc401129..59665eace0 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 @@ -56,8 +56,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\":\"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\":false,\"internalType\":\"bool\",\"name\":\"isOutOfOrder\",\"type\":\"bool\"}],\"name\":\"OutOfOrderExecutionChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"getOutOfOrderExecution\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"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\":\"outOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"setOutOfOrderExecution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b506040516200190938038062001909833981016040819052620000349162000291565b828233806000846001600160a01b0381166200006b576040516335fdcccd60e21b8152600060048201526024015b60405180910390fd5b6001600160a01b039081166080528216620000c95760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015260640162000062565b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000fc57620000fc81620001cd565b50506002805460ff60a01b1916905550600380546001600160a01b0319166001600160a01b0383811691821790925560405163095ea7b360e01b8152918416600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000172573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001989190620002ea565b505050806002620001aa919062000315565b600360156101000a81548160ff021916908360ff16021790555050505062000347565b336001600160a01b03821603620002275760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000062565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b03811681146200028e57600080fd5b50565b600080600060608486031215620002a757600080fd5b8351620002b48162000278565b6020850151909350620002c78162000278565b604085015190925060ff81168114620002df57600080fd5b809150509250925092565b600060208284031215620002fd57600080fd5b815180151581146200030e57600080fd5b9392505050565b60ff81811683821602908116908181146200034057634e487b7160e01b600052601160045260246000fd5b5092915050565b60805161159162000378600039600081816102f301528181610728015281816108180152610d0901526115916000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80638f491cba116100d8578063b5a110111161008c578063e6c725f511610066578063e6c725f5146103a9578063ef686d8e146103da578063f2fde38b146103ed57600080fd5b8063b5a110111461033a578063bee518a41461034d578063ca709a251461038b57600080fd5b8063ae90de55116100bd578063ae90de55146102ce578063b0f479a1146102f1578063b187bd261461031757600080fd5b80638f491cba146102a85780639d2aede5146102bb57600080fd5b80632b6e5d631161012f57806379ba50971161011457806379ba50971461026f57806385572ffb146102775780638da5cb5b1461028a57600080fd5b80632b6e5d631461021d578063665ed5371461025c57600080fd5b8063181f5a7711610160578063181f5a77146101b95780631892b906146102025780632874d8bf1461021557600080fd5b806301ffc9a71461017c57806316c38b3c146101a4575b600080fd5b61018f61018a366004610f0b565b610400565b60405190151581526020015b60405180910390f35b6101b76101b2366004610f54565b610499565b005b6101f56040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e352e30000000000000000081525081565b60405161019b9190610fda565b6101b761021036600461100a565b6104eb565b6101b7610546565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101b761026a366004610f54565b610582565b6101b761060e565b6101b7610285366004611025565b610710565b60005473ffffffffffffffffffffffffffffffffffffffff16610237565b6101b76102b6366004611060565b610795565b6101b76102c936600461109b565b610977565b60035474010000000000000000000000000000000000000000900460ff1661018f565b7f0000000000000000000000000000000000000000000000000000000000000000610237565b60025474010000000000000000000000000000000000000000900460ff1661018f565b6101b76103483660046110b8565b6109c6565b60015474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161019b565b60035473ffffffffffffffffffffffffffffffffffffffff16610237565b6003547501000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161019b565b6101b76103e83660046110ef565b610a68565b6101b76103fb36600461109b565b610aeb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb00000000000000000000000000000000000000000000000000000000148061049357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6104a1610afc565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104f3610afc565b6001805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b61054e610afc565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556105806001610b7d565b565b61058a610afc565b6003805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd99061060390831515815260200190565b60405180910390a150565b60015473ffffffffffffffffffffffffffffffffffffffff163314610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610781576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240161068b565b61079261078d82611317565b610dc0565b50565b6003547501000000000000000000000000000000000000000000900460ff1615806107dd57506003547501000000000000000000000000000000000000000000900460ff1681105b156107e55750565b600354600190610811907501000000000000000000000000000000000000000000900460ff16836113c4565b11610792577f00000000000000000000000000000000000000000000000000000000000000006001546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec91906113ff565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561093357600080fd5b505af1158015610947573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a150565b61097f610afc565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6109ce610afc565b6001805467ffffffffffffffff90931674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909316929092179091556002805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b610a70610afc565b600380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf390602001610603565b610af3610afc565b61079281610e16565b60005473ffffffffffffffffffffffffffffffffffffffff163314610580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161068b565b80600116600103610bc0576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1610bf4565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b610bfd81610795565b6040805160a0810190915260025473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001610c5591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015610ccf57816020015b6040805180820190915260008082526020820152815260200190600190039081610ca85790505b50815260035473ffffffffffffffffffffffffffffffffffffffff16602080830191909152604080519182018152600082529091015290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600160149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401610d7892919061141c565b6020604051808303816000875af1158015610d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb9190611531565b505050565b60008160600151806020019051810190610dda9190611531565b60025490915074010000000000000000000000000000000000000000900460ff16610e1257610e12610e0d82600161154a565b610b7d565b5050565b3373ffffffffffffffffffffffffffffffffffffffff821603610e95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161068b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215610f1d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4d57600080fd5b9392505050565b600060208284031215610f6657600080fd5b81358015158114610f4d57600080fd5b6000815180845260005b81811015610f9c57602081850181015186830182015201610f80565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f4d6020830184610f76565b803567ffffffffffffffff8116811461100557600080fd5b919050565b60006020828403121561101c57600080fd5b610f4d82610fed565b60006020828403121561103757600080fd5b813567ffffffffffffffff81111561104e57600080fd5b820160a08185031215610f4d57600080fd5b60006020828403121561107257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461079257600080fd5b6000602082840312156110ad57600080fd5b8135610f4d81611079565b600080604083850312156110cb57600080fd5b6110d483610fed565b915060208301356110e481611079565b809150509250929050565b60006020828403121561110157600080fd5b813560ff81168114610f4d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561116457611164611112565b60405290565b60405160a0810167ffffffffffffffff8111828210171561116457611164611112565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156111d4576111d4611112565b604052919050565b600082601f8301126111ed57600080fd5b813567ffffffffffffffff81111561120757611207611112565b61123860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161118d565b81815284602083860101111561124d57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261127b57600080fd5b8135602067ffffffffffffffff82111561129757611297611112565b6112a5818360051b0161118d565b82815260069290921b840181019181810190868411156112c457600080fd5b8286015b8481101561130c57604081890312156112e15760008081fd5b6112e9611141565b81356112f481611079565b815281850135858201528352918301916040016112c8565b509695505050505050565b600060a0823603121561132957600080fd5b61133161116a565b8235815261134160208401610fed565b6020820152604083013567ffffffffffffffff8082111561136157600080fd5b61136d368387016111dc565b6040840152606085013591508082111561138657600080fd5b611392368387016111dc565b606084015260808501359150808211156113ab57600080fd5b506113b83682860161126a565b60808301525092915050565b6000826113fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b60006020828403121561141157600080fd5b8151610f4d81611079565b6000604067ffffffffffffffff851683526020604081850152845160a0604086015261144b60e0860182610f76565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526114868383610f76565b6040890151888203830160808a01528051808352908601945060009350908501905b808410156114e7578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019390930192908601906114a8565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506115238187610f76565b9a9950505050505050505050565b60006020828403121561154357600080fd5b5051919050565b80820180821115610493577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000818000a", + 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\":\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"}],\"name\":\"ApprovedSenderRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"CCIPRouterModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"removeChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"countIncrBeforeFunding\",\"type\":\"uint8\"}],\"name\":\"CountIncrBeforeFundingSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenUpdated\",\"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\":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\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"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\":false,\"internalType\":\"bool\",\"name\":\"isOutOfOrder\",\"type\":\"bool\"}],\"name\":\"OutOfOrderExecutionChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawnByOwner\",\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"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\":\"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\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"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\":[],\"name\":\"getOutOfOrderExecution\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"isFailedMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"processMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"retryFailedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"s_chainConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"recipient\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgsBytes\",\"type\":\"bytes\"}],\"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\":\"bool\",\"name\":\"outOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"setOutOfOrderExecution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"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\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPBase.ApprovedSenderUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"}],\"name\":\"updateApprovedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"updateFeeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"updateRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usePreFundedFeeTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPreFunded\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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: "0x60a06040523480156200001157600080fd5b50604051620051ca380380620051ca83398101604081905262000034916200060a565b82828181600182803380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c68162000182565b5050506001600160a01b038116620000f1576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b039283166001600160a01b0319918216179091556007805492861692909116821790558215156080521590506200014b576002546200014b906001600160a01b0384811691166000196200022d565b50505050508060026200015f919062000663565b600860166101000a81548160ff021916908360ff16021790555050505062000753565b336001600160a01b03821603620001dc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b801580620002ab5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a9919062000695565b155b6200031f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200008a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003779185916200037c16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003cb906001600160a01b0385169084906200044d565b805190915015620003775780806020019051810190620003ec9190620006af565b620003775760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200008a565b60606200045e848460008562000466565b949350505050565b606082471015620004c95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200008a565b600080866001600160a01b03168587604051620004e7919062000700565b60006040518083038185875af1925050503d806000811462000526576040519150601f19603f3d011682016040523d82523d6000602084013e6200052b565b606091505b5090925090506200053f878383876200054a565b979650505050505050565b60608315620005be578251600003620005b6576001600160a01b0385163b620005b65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200008a565b50816200045e565b6200045e8383815115620005d55781518083602001fd5b8060405162461bcd60e51b81526004016200008a91906200071e565b6001600160a01b03811681146200060757600080fd5b50565b6000806000606084860312156200062057600080fd5b83516200062d81620005f1565b60208501519093506200064081620005f1565b604085015190925060ff811681146200065857600080fd5b809150509250925092565b60ff81811683821602908116908181146200068e57634e487b7160e01b600052601160045260246000fd5b5092915050565b600060208284031215620006a857600080fd5b5051919050565b600060208284031215620006c257600080fd5b81518015158114620006d357600080fd5b9392505050565b60005b83811015620006f7578181015183820152602001620006dd565b50506000910152565b6000825162000714818460208701620006da565b9190910192915050565b60208152600082518060208401526200073f816040850160208701620006da565b601f01601f19169190910160400192915050565b608051614a5462000776600039600081816103eb01526125b70152614a546000f3fe6080604052600436106101e75760003560e01c80638f491cba11610102578063c89245d511610095578063e6c725f511610064578063e6c725f514610671578063e89b4485146106b0578063ef686d8e146106d1578063f2fde38b146106f157600080fd5b8063c89245d5146105e6578063ca709a2514610606578063cf6730f814610631578063e4ca87541461065157600080fd5b8063b187bd26116100d1578063b187bd261461052b578063b5a110111461055b578063bee518a41461057b578063c851cc32146105c657600080fd5b80638f491cba1461048f5780639fe74e26146104af578063ae90de55146104cf578063b0f479a11461050057600080fd5b8063665ed5371161017a57806379ba50971161014957806379ba50971461040f5780638462a2b91461042457806385572ffb146104445780638da5cb5b1461046457600080fd5b8063665ed5371461036f5780636939cd971461038f5780636d62d633146103bc57806372be9eb8146103dc57600080fd5b80632874d8bf116101b65780632874d8bf146102c05780632b6e5d63146102d557806335f170ef146103215780635e35359e1461034f57600080fd5b80630a9094dc146101f35780630e958d6b1461022857806316c38b3c14610248578063181f5a771461026a57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004613766565b610711565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610213610243366004613795565b610724565b34801561025457600080fd5b50610268610263366004613828565b61076f565b005b34801561027657600080fd5b506102b36040518060400160405280601881526020017f53656c6646756e64656450696e67506f6e6720312e352e30000000000000000081525081565b60405161021f91906138b3565b3480156102cc57600080fd5b506102686107c1565b3480156102e157600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b34801561032d57600080fd5b5061034161033c3660046138c6565b6107fd565b60405161021f9291906138e3565b34801561035b57600080fd5b5061026861036a366004613933565b610929565b34801561037b57600080fd5b5061026861038a366004613828565b6109fe565b34801561039b57600080fd5b506103af6103aa366004613766565b610c94565b60405161021f91906139d1565b3480156103c857600080fd5b506102686103d7366004613a65565b610e9f565b3480156103e857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610213565b34801561041b57600080fd5b506102686110b7565b34801561043057600080fd5b5061026861043f366004613ae1565b6111b4565b34801561045057600080fd5b5061026861045f366004613b4d565b6114f5565b34801561047057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561049b57600080fd5b506102686104aa366004613766565b6116ec565b3480156104bb57600080fd5b506102686104ca366004613b88565b6118ca565b3480156104db57600080fd5b506008547501000000000000000000000000000000000000000000900460ff16610213565b34801561050c57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561053757600080fd5b5060085474010000000000000000000000000000000000000000900460ff16610213565b34801561056757600080fd5b50610268610576366004613bca565b611a83565b34801561058757600080fd5b5060075474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161021f565b3480156105d257600080fd5b506102686105e1366004613bf8565b611c8b565b3480156105f257600080fd5b50610268610601366004613bf8565b611d57565b34801561061257600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff166102fc565b34801561063d57600080fd5b5061026861064c366004613b4d565b611ec1565b34801561065d57600080fd5b5061026861066c366004613766565b61204c565b34801561067d57600080fd5b50600854760100000000000000000000000000000000000000000000900460ff1660405160ff909116815260200161021f565b6106c36106be366004613d4a565b61231a565b60405190815260200161021f565b3480156106dd57600080fd5b506102686106ec366004613e57565b612853565b3480156106fd57600080fd5b5061026861070c366004613bf8565b6128dd565b600061071e6005836128ee565b92915050565b67ffffffffffffffff831660009081526003602052604080822090516002909101906107539085908590613e7a565b9081526040519081900360200190205460ff1690509392505050565b610777612909565b6008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6107c9612909565b600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556107fb600161298a565b565b60036020526000908152604090208054819061081890613e8a565b80601f016020809104026020016040519081016040528092919081815260200182805461084490613e8a565b80156108915780601f1061086657610100808354040283529160200191610891565b820191906000526020600020905b81548152906001019060200180831161087457829003601f168201915b5050505050908060010180546108a690613e8a565b80601f01602080910402602001604051908101604052809291908181526020018280546108d290613e8a565b801561091f5780601f106108f45761010080835404028352916020019161091f565b820191906000526020600020905b81548152906001019060200180831161090257829003601f168201915b5050505050905082565b610931612909565b73ffffffffffffffffffffffffffffffffffffffff83166109715761096c73ffffffffffffffffffffffffffffffffffffffff831682612bc6565b610992565b61099273ffffffffffffffffffffffffffffffffffffffff84168383612d20565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6832d9be2410a86571981e1e60fd4c1f9ea2a1034d6102a2b7d6c5e480adf02e836040516109f191815260200190565b60405180910390a3505050565b610a06612909565b600880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000831515021790556002546007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015610ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b029190613eed565b905060008173ffffffffffffffffffffffffffffffffffffffff166306285c696040518163ffffffff1660e01b815260040161010060405180830381865afa158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190613f31565b9050610c186040518060400160405280836060015167ffffffffffffffff1681526020018515158152506040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b60075474010000000000000000000000000000000000000000900467ffffffffffffffff16600090815260036020526040902060010190610c59908261404b565b5060405183151581527f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd99060200160405180910390a1505050565b6040805160a08082018352600080835260208084018290526060848601819052808501819052608085015285825260048152908490208451928301855280548352600181015467ffffffffffffffff1691830191909152600281018054939492939192840191610d0390613e8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90613e8a565b8015610d7c5780601f10610d5157610100808354040283529160200191610d7c565b820191906000526020600020905b815481529060010190602001808311610d5f57829003601f168201915b50505050508152602001600382018054610d9590613e8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc190613e8a565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610e915760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610e3c565b505050915250909392505050565b610ea7612909565b610eb26005836128ee565b610ef0576040517fb6e78260000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b600082815260046020818152604080842090920180548351818402810184019094528084529091849084015b82821015610f715760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101610f1c565b50505060008581526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559293509050610fc160028301826136b4565b610fcf6003830160006136b4565b610fdd6004830160006136ee565b50610feb9050600584612df4565b5060005b81518110156110655761105d8383838151811061100e5761100e614165565b60200260200101516020015184848151811061102c5761102c614165565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612d209092919063ffffffff16565b600101610fef565b5060405173ffffffffffffffffffffffffffffffffffffffff8316815283907fd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957906020015b60405180910390a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ee7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6111bc612909565b60005b8181101561134f57600360008484848181106111dd576111dd614165565b90506020028101906111ef9190614194565b6111fd9060208101906138c6565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020183838381811061123457611234614165565b90506020028101906112469190614194565b6112549060208101906141d2565b604051611262929190613e7a565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558282828181106112a9576112a9614165565b90506020028101906112bb9190614194565b6112c99060208101906141d2565b6040516112d7929190613e7a565b60405180910390208383838181106112f1576112f1614165565b90506020028101906113039190614194565b6113119060208101906138c6565b67ffffffffffffffff167f021290bab0d93f4d9a243bd430e45dd4bc8238451e9abbba6fab4463677dfce960405160405180910390a36001016111bf565b5060005b838110156114ee5760016003600087878581811061137357611373614165565b90506020028101906113859190614194565b6113939060208101906138c6565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206002018686848181106113ca576113ca614165565b90506020028101906113dc9190614194565b6113ea9060208101906141d2565b6040516113f8929190613e7a565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905584848281811061144857611448614165565b905060200281019061145a9190614194565b6114689060208101906141d2565b604051611476929190613e7a565b604051809103902085858381811061149057611490614165565b90506020028101906114a29190614194565b6114b09060208101906138c6565b67ffffffffffffffff167f72d9f73bb7cb11065e15df29d61e803a0eba356d509a7025a6f51ebdea07f9e760405160405180910390a3600101611353565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314611548576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610ee7565b61155860408201602083016138c6565b67ffffffffffffffff81166000908152600360205260409020805461157c90613e8a565b90506000036115c3576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ee7565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906115ff908590600401614339565b600060405180830381600087803b15801561161957600080fd5b505af192505050801561162a575060015b6116bc573d808015611658576040519150601f19603f3d011682016040523d82523d6000602084013e61165d565b606091505b5061166a60058435612e00565b5082356000908152600460205260409020839061168782826146c3565b50506040518335907f55bc02a9ef6f146737edeeb425738006f67f077e7138de3bf84a15bde1a5b56f906110aa9084906138b3565b6040518235907fdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f90600090a25050565b600854760100000000000000000000000000000000000000000000900460ff1615806117365750600854760100000000000000000000000000000000000000000000900460ff1681105b1561173e5750565b60085460019061176b90760100000000000000000000000000000000000000000000900460ff16836147bd565b116118c75760025473ffffffffffffffffffffffffffffffffffffffff166007546040517fa8d87a3b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910467ffffffffffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff919091169063a8d87a3b90602401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190613eed565b73ffffffffffffffffffffffffffffffffffffffff1663eff7cc486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561188557600080fd5b505af1158015611899573d6000803e3d6000fd5b50506040517f302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c925060009150a15b50565b6118d2612909565b60005b81811015611a7e5760008383838181106118f1576118f1614165565b905060200281019061190391906147f8565b61190c9061482c565b9050806020015161197757805167ffffffffffffffff16600090815260036020526040812061193a916136b4565b805160405167ffffffffffffffff909116907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991690600090a2611a75565b8060400151516000036119b6576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151825167ffffffffffffffff166000908152600360205291909120906119e1908261404b565b506060810151815167ffffffffffffffff16600090815260036020526040902060010190611a0f908261404b565b508060400151604051611a2291906148dd565b6040518091039020816000015167ffffffffffffffff167f1ced5bcae649ed29cebfa0010298ad6794bf3822e8cb754a6eee5353a9a872128360600151604051611a6c91906138b3565b60405180910390a35b506001016118d5565b505050565b611a8b612909565b73ffffffffffffffffffffffffffffffffffffffff81161580611ab6575067ffffffffffffffff8216155b15611aed576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff851690810291909117909155600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560009182526003602090815260409283902083519182019290925260019260029092019101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611bde916148dd565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935573ffffffffffffffffffffffffffffffffffffffff84169183019190915201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815267ffffffffffffffff8416600090815260036020522090611a7e908261404b565b611c93612909565b73ffffffffffffffffffffffffffffffffffffffff8116611ce0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3672b589036f39ac008505b790fcb05d484d70b65680ec64c089a3c173fdc4c890600090a35050565b611d5f612909565b60075473ffffffffffffffffffffffffffffffffffffffff1615611dc057611dc0611d9f60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16906000612e0c565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355169015611e6d57611e6d611e2d60025473ffffffffffffffffffffffffffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff16907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612f8e565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f91a03e1d689caf891fe531c01e290f7b718f9c6a3af6726d6d837d2b7bd82e67910160405180910390a15050565b333014611efa576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f0a60408201602083016138c6565b611f1760408301836141d2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525067ffffffffffffffff861681526003602052604090208054909350611f6e92509050613e8a565b15905080611fc45750600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020181604051611faf91906148dd565b9081526040519081900360200190205460ff16155b15611ffd57806040517f5075bb38000000000000000000000000000000000000000000000000000000008152600401610ee791906138b3565b60085474010000000000000000000000000000000000000000900460ff16611a7e57611a7e61202f60608501856141d2565b81019061203c9190613766565b6120479060016148ef565b61298a565b6120576005826128ee565b612090576040517fb6e7826000000000000000000000000000000000000000000000000000000000815260048101829052602401610ee7565b6000818152600460209081526040808320815160a08101835281548152600182015467ffffffffffffffff169381019390935260028101805491928401916120d790613e8a565b80601f016020809104026020016040519081016040528092919081815260200182805461210390613e8a565b80156121505780601f1061212557610100808354040283529160200191612150565b820191906000526020600020905b81548152906001019060200180831161213357829003601f168201915b5050505050815260200160038201805461216990613e8a565b80601f016020809104026020016040519081016040528092919081815260200182805461219590613e8a565b80156121e25780601f106121b7576101008083540402835291602001916121e2565b820191906000526020600020905b8154815290600101906020018083116121c557829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156122655760008481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff168252600190810154828401529083529092019101612210565b5050509152505060008381526004602052604081208181556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690559192506122b760028301826136b4565b6122c56003830160006136b4565b6122d36004830160006136ee565b506122e19050600583612df4565b506122eb81613092565b60405182907fef3bf8c64bc480286c4f3503b870ceb23e648d2d902e31fb7bb46680da6de8ad90600090a25050565b67ffffffffffffffff83166000908152600360205260408120805485919061234190613e8a565b9050600003612388576040517fd79f2ea400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610ee7565b6040805160a08101825267ffffffffffffffff87166000908152600360205291822080548291906123b890613e8a565b80601f01602080910402602001604051908101604052809291908181526020018280546123e490613e8a565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b50505091835250506020808201879052604080830189905260075473ffffffffffffffffffffffffffffffffffffffff16606084015267ffffffffffffffff8a16600090815260039092529020600101805460809092019161249290613e8a565b80601f01602080910402602001604051908101604052809291908181526020018280546124be90613e8a565b801561250b5780601f106124e05761010080835404028352916020019161250b565b820191906000526020600020905b8154815290600101906020018083116124ee57829003601f168201915b5050509190925250506002546040517f20487ded00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906320487ded90612572908a908690600401614902565b602060405180830381865afa15801561258f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b391906149cf565b90507f00000000000000000000000000000000000000000000000000000000000000001580156125fa575060075473ffffffffffffffffffffffffffffffffffffffff1615155b15612624576007546126249073ffffffffffffffffffffffffffffffffffffffff16333084613104565b60005b865181101561277757612697333089848151811061264757612647614165565b6020026020010151602001518a858151811061266557612665614165565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16613104909392919063ffffffff16565b600754875173ffffffffffffffffffffffffffffffffffffffff909116908890839081106126c7576126c7614165565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161461276f57600254875161276f9173ffffffffffffffffffffffffffffffffffffffff169089908490811061272057612720614165565b60200260200101516020015189848151811061273e5761273e614165565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16612e0c9092919063ffffffff16565b600101612627565b5060025460075473ffffffffffffffffffffffffffffffffffffffff918216916396f4e9f99116156127aa5760006127ac565b825b89856040518463ffffffff1660e01b81526004016127cb929190614902565b60206040518083038185885af11580156127e9573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061280e91906149cf565b93507f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8460405161284191815260200190565b60405180910390a15050509392505050565b61285b612909565b600880547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000060ff8416908102919091179091556040519081527f4768dbf8645b24c54f2887651545d24f748c0d0d1d4c689eb810fb19f0befcf39060200160405180910390a150565b6128e5612909565b6118c781613162565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ee7565b806001166001036129cd576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a1612a01565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b612a0a816116ec565b6040805160a0810190915260085473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e08101604051602081830303815290604052815260200183604051602001612a6291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905281526020016000604051908082528060200260200182016040528015612adc57816020015b6040805180820190915260008082526020820152815260200190600190039081612ab55790505b50815260075473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260408051918201815260008252909101529050612b3360025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166396f4e9f9600760149054906101000a900467ffffffffffffffff16836040518363ffffffff1660e01b8152600401612b83929190614902565b6020604051808303816000875af1158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7e91906149cf565b80471015612c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ee7565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612c8a576040519150601f19603f3d011682016040523d82523d6000602084013e612c8f565b606091505b5050905080611a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ee7565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611a7e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613257565b60006129028383613363565b60006129028383613456565b801580612eac57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eaa91906149cf565b155b612f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ee7565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611a7e9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612d72565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015613005573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302991906149cf565b61303391906148ef565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061308c9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612d72565b50505050565b61309a612909565b6040517fcf6730f8000000000000000000000000000000000000000000000000000000008152309063cf6730f8906130d69084906004016139d1565b600060405180830381600087803b1580156130f057600080fd5b505af11580156114ee573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261308c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d72565b3373ffffffffffffffffffffffffffffffffffffffff8216036131e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ee7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006132b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134a59092919063ffffffff16565b805190915015611a7e57808060200190518101906132d791906149e8565b611a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ee7565b6000818152600183016020526040812054801561344c576000613387600183614a05565b855490915060009061339b90600190614a05565b90508181146134005760008660000182815481106133bb576133bb614165565b90600052602060002001549050808760000184815481106133de576133de614165565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061341157613411614a18565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061071e565b600091505061071e565b600081815260018301602052604081205461349d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561071e565b50600061071e565b60606134b484846000856134bc565b949350505050565b60608247101561354e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ee7565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161357791906148dd565b60006040518083038185875af1925050503d80600081146135b4576040519150601f19603f3d011682016040523d82523d6000602084013e6135b9565b606091505b50915091506135ca878383876135d5565b979650505050505050565b6060831561366b5782516000036136645773ffffffffffffffffffffffffffffffffffffffff85163b613664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ee7565b50816134b4565b6134b483838151156136805781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee791906138b3565b5080546136c090613e8a565b6000825580601f106136d0575050565b601f0160209004906000526020600020908101906118c7919061370f565b50805460008255600202906000526020600020908101906118c79190613728565b5b808211156137245760008155600101613710565b5090565b5b808211156137245780547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560006001820155600201613729565b60006020828403121561377857600080fd5b5035919050565b67ffffffffffffffff811681146118c757600080fd5b6000806000604084860312156137aa57600080fd5b83356137b58161377f565b9250602084013567ffffffffffffffff808211156137d257600080fd5b818601915086601f8301126137e657600080fd5b8135818111156137f557600080fd5b87602082850101111561380757600080fd5b6020830194508093505050509250925092565b80151581146118c757600080fd5b60006020828403121561383a57600080fd5b81356129028161381a565b60005b83811015613860578181015183820152602001613848565b50506000910152565b60008151808452613881816020860160208601613845565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129026020830184613869565b6000602082840312156138d857600080fd5b81356129028161377f565b6040815260006138f66040830185613869565b82810360208401526139088185613869565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146118c757600080fd5b60008060006060848603121561394857600080fd5b833561395381613911565b9250602084013561396381613911565b929592945050506040919091013590565b60008151808452602080850194506020840160005b838110156139c6578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101613989565b509495945050505050565b602081528151602082015267ffffffffffffffff60208301511660408201526000604083015160a06060840152613a0b60c0840182613869565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016080860152613a478383613869565b925060808601519150808584030160a0860152506139088282613974565b60008060408385031215613a7857600080fd5b823591506020830135613a8a81613911565b809150509250929050565b60008083601f840112613aa757600080fd5b50813567ffffffffffffffff811115613abf57600080fd5b6020830191508360208260051b8501011115613ada57600080fd5b9250929050565b60008060008060408587031215613af757600080fd5b843567ffffffffffffffff80821115613b0f57600080fd5b613b1b88838901613a95565b90965094506020870135915080821115613b3457600080fd5b50613b4187828801613a95565b95989497509550505050565b600060208284031215613b5f57600080fd5b813567ffffffffffffffff811115613b7657600080fd5b820160a0818503121561290257600080fd5b60008060208385031215613b9b57600080fd5b823567ffffffffffffffff811115613bb257600080fd5b613bbe85828601613a95565b90969095509350505050565b60008060408385031215613bdd57600080fd5b8235613be88161377f565b91506020830135613a8a81613911565b600060208284031215613c0a57600080fd5b813561290281613911565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613c6757613c67613c15565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613cb457613cb4613c15565b604052919050565b600082601f830112613ccd57600080fd5b813567ffffffffffffffff811115613ce757613ce7613c15565b613d1860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c6d565b818152846020838601011115613d2d57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613d5f57600080fd5b8335613d6a8161377f565b925060208481013567ffffffffffffffff80821115613d8857600080fd5b818701915087601f830112613d9c57600080fd5b813581811115613dae57613dae613c15565b613dbc848260051b01613c6d565b81815260069190911b8301840190848101908a831115613ddb57600080fd5b938501935b82851015613e27576040858c031215613df95760008081fd5b613e01613c44565b8535613e0c81613911565b81528587013587820152825260409094019390850190613de0565b965050506040870135925080831115613e3f57600080fd5b5050613e4d86828701613cbc565b9150509250925092565b600060208284031215613e6957600080fd5b813560ff8116811461290257600080fd5b8183823760009101908152919050565b600181811c90821680613e9e57607f821691505b602082108103613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8051613ee881613911565b919050565b600060208284031215613eff57600080fd5b815161290281613911565b8051613ee88161377f565b80516bffffffffffffffffffffffff81168114613ee857600080fd5b6000610100808385031215613f4557600080fd5b6040519081019067ffffffffffffffff82118183101715613f6857613f68613c15565b8160405283519150613f7982613911565b818152613f8860208501613f0a565b6020820152613f9960408501613f0a565b6040820152613faa60608501613f0a565b6060820152613fbb60808501613f15565b6080820152613fcc60a08501613edd565b60a0820152613fdd60c08501613edd565b60c0820152613fee60e08501613edd565b60e0820152949350505050565b601f821115611a7e576000816000526020600020601f850160051c810160208610156140245750805b601f850160051c820191505b8181101561404357828155600101614030565b505050505050565b815167ffffffffffffffff81111561406557614065613c15565b614079816140738454613e8a565b84613ffb565b602080601f8311600181146140cc57600084156140965750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614043565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614119578886015182559484019460019091019084016140fa565b508582101561415557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126141c857600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261420757600080fd5b83018035915067ffffffffffffffff82111561422257600080fd5b602001915036819003821315613ada57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261426c57600080fd5b830160208101925035905067ffffffffffffffff81111561428c57600080fd5b803603821315613ada57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156139c657813561430781613911565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016142f4565b6020815281356020820152600060208301356143548161377f565b67ffffffffffffffff80821660408501526143726040860186614237565b925060a0606086015261438960c08601848361429b565b9250506143996060860186614237565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526143cf85838561429b565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261440857600080fd5b6020928801928301923591508382111561442157600080fd5b8160061b360383131561443357600080fd5b8685030160a08701526135ca8482846142e4565b67ffffffffffffffff83111561445f5761445f613c15565b6144738361446d8354613e8a565b83613ffb565b6000601f8411600181146144c5576000851561448f5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556114ee565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561451457868501358255602094850194600190920191016144f4565b508682101561454f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b813561459b81613911565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550602082013560018201555050565b6801000000000000000083111561460157614601613c15565b80548382558084101561468e5760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461464257614642614561565b808616861461465357614653614561565b5060008360005260206000208360011b81018760011b820191505b8082101561468957828255828483015560028201915061466e565b505050505b5060008181526020812083915b85811015614043576146ad8383614590565b604092909201916002919091019060010161469b565b813581556001810160208301356146d98161377f565b67ffffffffffffffff8082167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000084541617835561471960408601866141d2565b9350915061472b838360028701614447565b61473860608601866141d2565b9350915061474a838360038701614447565b608085013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301831261478157600080fd5b91840191823591508082111561479657600080fd5b506020820191508060061b36038213156147af57600080fd5b61308c8183600486016145e8565b6000826147f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141c857600080fd5b60006080823603121561483e57600080fd5b6040516080810167ffffffffffffffff828210818311171561486257614862613c15565b81604052843591506148738261377f565b9082526020840135906148858261381a565b816020840152604085013591508082111561489f57600080fd5b6148ab36838701613cbc565b604084015260608501359150808211156148c457600080fd5b506148d136828601613cbc565b60608301525092915050565b600082516141c8818460208701613845565b8082018082111561071e5761071e614561565b67ffffffffffffffff83168152604060208201526000825160a0604084015261492e60e0840182613869565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261496a8383613869565b925060408601519150808584030160808601526149878383613974565b925073ffffffffffffffffffffffffffffffffffffffff60608701511660a086015260808601519150808584030160c0860152506149c58282613869565b9695505050505050565b6000602082840312156149e157600080fd5b5051919050565b6000602082840312156149fa57600080fd5b81516129028161381a565b8181038181111561071e5761071e614561565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var SelfFundedPingPongABI = SelfFundedPingPongMetaData.ABI @@ -284,6 +284,28 @@ func (_SelfFundedPingPong *SelfFundedPingPongCallerSession) GetFeeToken() (commo return _SelfFundedPingPong.Contract.GetFeeToken(&_SelfFundedPingPong.CallOpts) } +func (_SelfFundedPingPong *SelfFundedPingPongCaller) GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) { + var out []interface{} + err := _SelfFundedPingPong.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 (_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) GetOutOfOrderExecution(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _SelfFundedPingPong.contract.Call(opts, &out, "getOutOfOrderExecution") @@ -610,30 +632,6 @@ func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpart(c return _SelfFundedPingPong.Contract.SetCounterpart(&_SelfFundedPingPong.TransactOpts, counterpartChainSelector, counterpartAddress) } -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setCounterpartAddress", addr) -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartAddress(&_SelfFundedPingPong.TransactOpts, addr) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartAddress(&_SelfFundedPingPong.TransactOpts, addr) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { - return _SelfFundedPingPong.contract.Transact(opts, "setCounterpartChainSelector", chainSelector) -} - -func (_SelfFundedPingPong *SelfFundedPingPongSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartChainSelector(&_SelfFundedPingPong.TransactOpts, chainSelector) -} - -func (_SelfFundedPingPong *SelfFundedPingPongTransactorSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { - return _SelfFundedPingPong.Contract.SetCounterpartChainSelector(&_SelfFundedPingPong.TransactOpts, chainSelector) -} - func (_SelfFundedPingPong *SelfFundedPingPongTransactor) SetOutOfOrderExecution(opts *bind.TransactOpts, outOfOrderExecution bool) (*types.Transaction, error) { return _SelfFundedPingPong.contract.Transact(opts, "setOutOfOrderExecution", outOfOrderExecution) } @@ -1765,8 +1763,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseFunded(log types.Log return event, nil } -type SelfFundedPingPongOutOfOrderExecutionChangeIterator struct { - Event *SelfFundedPingPongOutOfOrderExecutionChange +type SelfFundedPingPongMessageAbandonedIterator struct { + Event *SelfFundedPingPongMessageAbandoned contract *bind.BoundContract event string @@ -1777,7 +1775,7 @@ type SelfFundedPingPongOutOfOrderExecutionChangeIterator struct { fail error } -func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Next() bool { +func (it *SelfFundedPingPongMessageAbandonedIterator) Next() bool { if it.fail != nil { return false @@ -1786,7 +1784,7 @@ func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongOutOfOrderExecutionChange) + it.Event = new(SelfFundedPingPongMessageAbandoned) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1801,7 +1799,7 @@ func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongOutOfOrderExecutionChange) + it.Event = new(SelfFundedPingPongMessageAbandoned) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1816,32 +1814,43 @@ func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Next() bool { } } -func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Error() error { +func (it *SelfFundedPingPongMessageAbandonedIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Close() error { +func (it *SelfFundedPingPongMessageAbandonedIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongOutOfOrderExecutionChange struct { - IsOutOfOrder bool - Raw types.Log +type SelfFundedPingPongMessageAbandoned struct { + MessageId [32]byte + TokenReceiver common.Address + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*SelfFundedPingPongOutOfOrderExecutionChangeIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageAbandoned(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageAbandonedIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "OutOfOrderExecutionChange") + 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 &SelfFundedPingPongOutOfOrderExecutionChangeIterator{contract: _SelfFundedPingPong.contract, event: "OutOfOrderExecutionChange", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageAbandonedIterator{contract: _SelfFundedPingPong.contract, event: "MessageAbandoned", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOutOfOrderExecutionChange) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageAbandoned(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageAbandoned, messageId [][32]byte) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "OutOfOrderExecutionChange") + 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 } @@ -1851,8 +1860,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOutOfOrderExecutionC select { case log := <-logs: - event := new(SelfFundedPingPongOutOfOrderExecutionChange) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { + event := new(SelfFundedPingPongMessageAbandoned) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageAbandoned", log); err != nil { return err } event.Raw = log @@ -1873,17 +1882,17 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOutOfOrderExecutionC }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseOutOfOrderExecutionChange(log types.Log) (*SelfFundedPingPongOutOfOrderExecutionChange, error) { - event := new(SelfFundedPingPongOutOfOrderExecutionChange) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != 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 SelfFundedPingPongOwnershipTransferRequestedIterator struct { - Event *SelfFundedPingPongOwnershipTransferRequested +type SelfFundedPingPongMessageFailedIterator struct { + Event *SelfFundedPingPongMessageFailed contract *bind.BoundContract event string @@ -1894,7 +1903,7 @@ type SelfFundedPingPongOwnershipTransferRequestedIterator struct { fail error } -func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Next() bool { +func (it *SelfFundedPingPongMessageFailedIterator) Next() bool { if it.fail != nil { return false @@ -1903,7 +1912,7 @@ func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongOwnershipTransferRequested) + it.Event = new(SelfFundedPingPongMessageFailed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1918,7 +1927,7 @@ func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongOwnershipTransferRequested) + it.Event = new(SelfFundedPingPongMessageFailed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1933,51 +1942,43 @@ func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Next() bool { } } -func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Error() error { +func (it *SelfFundedPingPongMessageFailedIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Close() error { +func (it *SelfFundedPingPongMessageFailedIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongOwnershipTransferRequested struct { - From common.Address - To common.Address - Raw types.Log +type SelfFundedPingPongMessageFailed struct { + MessageId [32]byte + Reason []byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SelfFundedPingPongOwnershipTransferRequestedIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageFailed(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageFailedIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageFailed", messageIdRule) if err != nil { return nil, err } - return &SelfFundedPingPongOwnershipTransferRequestedIterator{contract: _SelfFundedPingPong.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageFailedIterator{contract: _SelfFundedPingPong.contract, event: "MessageFailed", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageFailed(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageFailed, messageId [][32]byte) (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) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageFailed", messageIdRule) if err != nil { return nil, err } @@ -1987,8 +1988,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferReq select { case log := <-logs: - event := new(SelfFundedPingPongOwnershipTransferRequested) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + event := new(SelfFundedPingPongMessageFailed) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageFailed", log); err != nil { return err } event.Raw = log @@ -2009,17 +2010,17 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferReq }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseOwnershipTransferRequested(log types.Log) (*SelfFundedPingPongOwnershipTransferRequested, error) { - event := new(SelfFundedPingPongOwnershipTransferRequested) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { +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 } -type SelfFundedPingPongOwnershipTransferredIterator struct { - Event *SelfFundedPingPongOwnershipTransferred +type SelfFundedPingPongMessageRecoveredIterator struct { + Event *SelfFundedPingPongMessageRecovered contract *bind.BoundContract event string @@ -2030,7 +2031,7 @@ type SelfFundedPingPongOwnershipTransferredIterator struct { fail error } -func (it *SelfFundedPingPongOwnershipTransferredIterator) Next() bool { +func (it *SelfFundedPingPongMessageRecoveredIterator) Next() bool { if it.fail != nil { return false @@ -2039,7 +2040,7 @@ func (it *SelfFundedPingPongOwnershipTransferredIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongOwnershipTransferred) + it.Event = new(SelfFundedPingPongMessageRecovered) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2054,7 +2055,7 @@ func (it *SelfFundedPingPongOwnershipTransferredIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongOwnershipTransferred) + it.Event = new(SelfFundedPingPongMessageRecovered) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2069,51 +2070,42 @@ func (it *SelfFundedPingPongOwnershipTransferredIterator) Next() bool { } } -func (it *SelfFundedPingPongOwnershipTransferredIterator) Error() error { +func (it *SelfFundedPingPongMessageRecoveredIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongOwnershipTransferredIterator) Close() error { +func (it *SelfFundedPingPongMessageRecoveredIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongOwnershipTransferred struct { - From common.Address - To common.Address - Raw types.Log +type SelfFundedPingPongMessageRecovered struct { + MessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SelfFundedPingPongOwnershipTransferredIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageRecovered(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageRecoveredIterator, error) { - var fromRule []interface{} - for _, fromItem := range from { - fromRule = append(fromRule, fromItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageRecovered", messageIdRule) if err != nil { return nil, err } - return &SelfFundedPingPongOwnershipTransferredIterator{contract: _SelfFundedPingPong.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageRecoveredIterator{contract: _SelfFundedPingPong.contract, event: "MessageRecovered", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageRecovered(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageRecovered, messageId [][32]byte) (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) + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) } - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageRecovered", messageIdRule) if err != nil { return nil, err } @@ -2123,8 +2115,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferred select { case log := <-logs: - event := new(SelfFundedPingPongOwnershipTransferred) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + event := new(SelfFundedPingPongMessageRecovered) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageRecovered", log); err != nil { return err } event.Raw = log @@ -2145,17 +2137,17 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferred }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseOwnershipTransferred(log types.Log) (*SelfFundedPingPongOwnershipTransferred, error) { - event := new(SelfFundedPingPongOwnershipTransferred) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { +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 SelfFundedPingPongPingIterator struct { - Event *SelfFundedPingPongPing +type SelfFundedPingPongMessageSentIterator struct { + Event *SelfFundedPingPongMessageSent contract *bind.BoundContract event string @@ -2166,7 +2158,7 @@ type SelfFundedPingPongPingIterator struct { fail error } -func (it *SelfFundedPingPongPingIterator) Next() bool { +func (it *SelfFundedPingPongMessageSentIterator) Next() bool { if it.fail != nil { return false @@ -2175,7 +2167,7 @@ func (it *SelfFundedPingPongPingIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongPing) + it.Event = new(SelfFundedPingPongMessageSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2190,7 +2182,7 @@ func (it *SelfFundedPingPongPingIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongPing) + it.Event = new(SelfFundedPingPongMessageSent) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2205,32 +2197,32 @@ func (it *SelfFundedPingPongPingIterator) Next() bool { } } -func (it *SelfFundedPingPongPingIterator) Error() error { +func (it *SelfFundedPingPongMessageSentIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongPingIterator) Close() error { +func (it *SelfFundedPingPongMessageSentIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongPing struct { - PingPongCount *big.Int - Raw types.Log +type SelfFundedPingPongMessageSent struct { + MessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterPing(opts *bind.FilterOpts) (*SelfFundedPingPongPingIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageSent(opts *bind.FilterOpts) (*SelfFundedPingPongMessageSentIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "Ping") + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "MessageSent") if err != nil { return nil, err } - return &SelfFundedPingPongPingIterator{contract: _SelfFundedPingPong.contract, event: "Ping", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageSentIterator{contract: _SelfFundedPingPong.contract, event: "MessageSent", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPing(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPing) (event.Subscription, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "Ping") + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "MessageSent") if err != nil { return nil, err } @@ -2240,8 +2232,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPing(opts *bind.Watc select { case log := <-logs: - event := new(SelfFundedPingPongPing) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "Ping", log); err != nil { + event := new(SelfFundedPingPongMessageSent) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageSent", log); err != nil { return err } event.Raw = log @@ -2262,17 +2254,17 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPing(opts *bind.Watc }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePing(log types.Log) (*SelfFundedPingPongPing, error) { - event := new(SelfFundedPingPongPing) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "Ping", 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 SelfFundedPingPongPongIterator struct { - Event *SelfFundedPingPongPong +type SelfFundedPingPongMessageSucceededIterator struct { + Event *SelfFundedPingPongMessageSucceeded contract *bind.BoundContract event string @@ -2283,7 +2275,7 @@ type SelfFundedPingPongPongIterator struct { fail error } -func (it *SelfFundedPingPongPongIterator) Next() bool { +func (it *SelfFundedPingPongMessageSucceededIterator) Next() bool { if it.fail != nil { return false @@ -2292,7 +2284,7 @@ func (it *SelfFundedPingPongPongIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongPong) + it.Event = new(SelfFundedPingPongMessageSucceeded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2307,7 +2299,7 @@ func (it *SelfFundedPingPongPongIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongPong) + it.Event = new(SelfFundedPingPongMessageSucceeded) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2322,32 +2314,42 @@ func (it *SelfFundedPingPongPongIterator) Next() bool { } } -func (it *SelfFundedPingPongPongIterator) Error() error { +func (it *SelfFundedPingPongMessageSucceededIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongPongIterator) Close() error { +func (it *SelfFundedPingPongMessageSucceededIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongPong struct { - PingPongCount *big.Int - Raw types.Log +type SelfFundedPingPongMessageSucceeded struct { + MessageId [32]byte + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterPong(opts *bind.FilterOpts) (*SelfFundedPingPongPongIterator, error) { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterMessageSucceeded(opts *bind.FilterOpts, messageId [][32]byte) (*SelfFundedPingPongMessageSucceededIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "Pong") + 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 &SelfFundedPingPongPongIterator{contract: _SelfFundedPingPong.contract, event: "Pong", logs: logs, sub: sub}, nil + return &SelfFundedPingPongMessageSucceededIterator{contract: _SelfFundedPingPong.contract, event: "MessageSucceeded", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPong(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPong) (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, "Pong") + 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 } @@ -2357,8 +2359,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPong(opts *bind.Watc select { case log := <-logs: - event := new(SelfFundedPingPongPong) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "Pong", log); err != nil { + event := new(SelfFundedPingPongMessageSucceeded) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "MessageSucceeded", log); err != nil { return err } event.Raw = log @@ -2379,17 +2381,17 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPong(opts *bind.Watc }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePong(log types.Log) (*SelfFundedPingPongPong, error) { - event := new(SelfFundedPingPongPong) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "Pong", 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 return event, nil } -type SelfFundedPingPongTokensWithdrawnByOwnerIterator struct { - Event *SelfFundedPingPongTokensWithdrawnByOwner +type SelfFundedPingPongOutOfOrderExecutionChangeIterator struct { + Event *SelfFundedPingPongOutOfOrderExecutionChange contract *bind.BoundContract event string @@ -2400,7 +2402,7 @@ type SelfFundedPingPongTokensWithdrawnByOwnerIterator struct { fail error } -func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Next() bool { +func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Next() bool { if it.fail != nil { return false @@ -2409,7 +2411,7 @@ func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongTokensWithdrawnByOwner) + it.Event = new(SelfFundedPingPongOutOfOrderExecutionChange) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2424,7 +2426,7 @@ func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(SelfFundedPingPongTokensWithdrawnByOwner) + it.Event = new(SelfFundedPingPongOutOfOrderExecutionChange) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2439,52 +2441,32 @@ func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Next() bool { } } -func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Error() error { +func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Error() error { return it.fail } -func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Close() error { +func (it *SelfFundedPingPongOutOfOrderExecutionChangeIterator) Close() error { it.sub.Unsubscribe() return nil } -type SelfFundedPingPongTokensWithdrawnByOwner struct { - Token common.Address - To common.Address - Amount *big.Int - Raw types.Log +type SelfFundedPingPongOutOfOrderExecutionChange struct { + IsOutOfOrder bool + Raw types.Log } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*SelfFundedPingPongTokensWithdrawnByOwnerIterator, error) { - - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*SelfFundedPingPongOutOfOrderExecutionChangeIterator, error) { - logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "OutOfOrderExecutionChange") if err != nil { return nil, err } - return &SelfFundedPingPongTokensWithdrawnByOwnerIterator{contract: _SelfFundedPingPong.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil + return &SelfFundedPingPongOutOfOrderExecutionChangeIterator{contract: _SelfFundedPingPong.contract, event: "OutOfOrderExecutionChange", logs: logs, sub: sub}, nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { - - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } - var toRule []interface{} - for _, toItem := range to { - toRule = append(toRule, toItem) - } +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOutOfOrderExecutionChange) (event.Subscription, error) { - logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "OutOfOrderExecutionChange") if err != nil { return nil, err } @@ -2494,8 +2476,8 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchTokensWithdrawnByOwn select { case log := <-logs: - event := new(SelfFundedPingPongTokensWithdrawnByOwner) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + event := new(SelfFundedPingPongOutOfOrderExecutionChange) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { return err } event.Raw = log @@ -2516,38 +2498,691 @@ func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchTokensWithdrawnByOwn }), nil } -func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseTokensWithdrawnByOwner(log types.Log) (*SelfFundedPingPongTokensWithdrawnByOwner, error) { - event := new(SelfFundedPingPongTokensWithdrawnByOwner) - if err := _SelfFundedPingPong.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseOutOfOrderExecutionChange(log types.Log) (*SelfFundedPingPongOutOfOrderExecutionChange, error) { + event := new(SelfFundedPingPongOutOfOrderExecutionChange) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { return nil, err } event.Raw = log return event, nil } -type SChainConfigs struct { - Recipient []byte - ExtraArgsBytes []byte +type SelfFundedPingPongOwnershipTransferRequestedIterator struct { + Event *SelfFundedPingPongOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error } -func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generated.AbigenLog, error) { - switch log.Topics[0] { - case _SelfFundedPingPong.abi.Events["ApprovedSenderAdded"].ID: - return _SelfFundedPingPong.ParseApprovedSenderAdded(log) - case _SelfFundedPingPong.abi.Events["ApprovedSenderRemoved"].ID: - return _SelfFundedPingPong.ParseApprovedSenderRemoved(log) - case _SelfFundedPingPong.abi.Events["CCIPRouterModified"].ID: - return _SelfFundedPingPong.ParseCCIPRouterModified(log) - case _SelfFundedPingPong.abi.Events["ChainAdded"].ID: - return _SelfFundedPingPong.ParseChainAdded(log) - case _SelfFundedPingPong.abi.Events["ChainRemoved"].ID: - return _SelfFundedPingPong.ParseChainRemoved(log) - case _SelfFundedPingPong.abi.Events["CountIncrBeforeFundingSet"].ID: - return _SelfFundedPingPong.ParseCountIncrBeforeFundingSet(log) +func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongOwnershipTransferRequested) + 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(SelfFundedPingPongOwnershipTransferRequested) + 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 *SelfFundedPingPongOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SelfFundedPingPongOwnershipTransferRequestedIterator, 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 := _SelfFundedPingPong.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongOwnershipTransferRequestedIterator{contract: _SelfFundedPingPong.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOwnershipTransferRequested, 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 := _SelfFundedPingPong.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(SelfFundedPingPongOwnershipTransferRequested) + if err := _SelfFundedPingPong.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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseOwnershipTransferRequested(log types.Log) (*SelfFundedPingPongOwnershipTransferRequested, error) { + event := new(SelfFundedPingPongOwnershipTransferRequested) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongOwnershipTransferredIterator struct { + Event *SelfFundedPingPongOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongOwnershipTransferred) + 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(SelfFundedPingPongOwnershipTransferred) + 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 *SelfFundedPingPongOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SelfFundedPingPongOwnershipTransferredIterator, 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 := _SelfFundedPingPong.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongOwnershipTransferredIterator{contract: _SelfFundedPingPong.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOwnershipTransferred, 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 := _SelfFundedPingPong.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(SelfFundedPingPongOwnershipTransferred) + if err := _SelfFundedPingPong.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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParseOwnershipTransferred(log types.Log) (*SelfFundedPingPongOwnershipTransferred, error) { + event := new(SelfFundedPingPongOwnershipTransferred) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongPingIterator struct { + Event *SelfFundedPingPongPing + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongPingIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongPing) + 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(SelfFundedPingPongPing) + 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 *SelfFundedPingPongPingIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongPingIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongPing struct { + PingPongCount *big.Int + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterPing(opts *bind.FilterOpts) (*SelfFundedPingPongPingIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "Ping") + if err != nil { + return nil, err + } + return &SelfFundedPingPongPingIterator{contract: _SelfFundedPingPong.contract, event: "Ping", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPing(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPing) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.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(SelfFundedPingPongPing) + if err := _SelfFundedPingPong.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 (_SelfFundedPingPong *SelfFundedPingPongFilterer) ParsePing(log types.Log) (*SelfFundedPingPongPing, error) { + event := new(SelfFundedPingPongPing) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "Ping", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongPongIterator struct { + Event *SelfFundedPingPongPong + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongPongIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongPong) + 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(SelfFundedPingPongPong) + 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 *SelfFundedPingPongPongIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongPongIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongPong struct { + PingPongCount *big.Int + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterPong(opts *bind.FilterOpts) (*SelfFundedPingPongPongIterator, error) { + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "Pong") + if err != nil { + return nil, err + } + return &SelfFundedPingPongPongIterator{contract: _SelfFundedPingPong.contract, event: "Pong", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchPong(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongPong) (event.Subscription, error) { + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "Pong") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SelfFundedPingPongPong) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "Pong", 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) ParsePong(log types.Log) (*SelfFundedPingPongPong, error) { + event := new(SelfFundedPingPongPong) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "Pong", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SelfFundedPingPongTokensWithdrawnByOwnerIterator struct { + Event *SelfFundedPingPongTokensWithdrawnByOwner + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SelfFundedPingPongTokensWithdrawnByOwner) + 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(SelfFundedPingPongTokensWithdrawnByOwner) + 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 *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Error() error { + return it.fail +} + +func (it *SelfFundedPingPongTokensWithdrawnByOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SelfFundedPingPongTokensWithdrawnByOwner struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) FilterTokensWithdrawnByOwner(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*SelfFundedPingPongTokensWithdrawnByOwnerIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.FilterLogs(opts, "TokensWithdrawnByOwner", tokenRule, toRule) + if err != nil { + return nil, err + } + return &SelfFundedPingPongTokensWithdrawnByOwnerIterator{contract: _SelfFundedPingPong.contract, event: "TokensWithdrawnByOwner", logs: logs, sub: sub}, nil +} + +func (_SelfFundedPingPong *SelfFundedPingPongFilterer) WatchTokensWithdrawnByOwner(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongTokensWithdrawnByOwner, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _SelfFundedPingPong.contract.WatchLogs(opts, "TokensWithdrawnByOwner", tokenRule, 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(SelfFundedPingPongTokensWithdrawnByOwner) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "TokensWithdrawnByOwner", 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) ParseTokensWithdrawnByOwner(log types.Log) (*SelfFundedPingPongTokensWithdrawnByOwner, error) { + event := new(SelfFundedPingPongTokensWithdrawnByOwner) + if err := _SelfFundedPingPong.contract.UnpackLog(event, "TokensWithdrawnByOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SChainConfigs struct { + Recipient []byte + ExtraArgsBytes []byte +} + +func (_SelfFundedPingPong *SelfFundedPingPong) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _SelfFundedPingPong.abi.Events["ApprovedSenderAdded"].ID: + return _SelfFundedPingPong.ParseApprovedSenderAdded(log) + case _SelfFundedPingPong.abi.Events["ApprovedSenderRemoved"].ID: + return _SelfFundedPingPong.ParseApprovedSenderRemoved(log) + case _SelfFundedPingPong.abi.Events["CCIPRouterModified"].ID: + return _SelfFundedPingPong.ParseCCIPRouterModified(log) + case _SelfFundedPingPong.abi.Events["ChainAdded"].ID: + return _SelfFundedPingPong.ParseChainAdded(log) + case _SelfFundedPingPong.abi.Events["ChainRemoved"].ID: + return _SelfFundedPingPong.ParseChainRemoved(log) + case _SelfFundedPingPong.abi.Events["CountIncrBeforeFundingSet"].ID: + return _SelfFundedPingPong.ParseCountIncrBeforeFundingSet(log) case _SelfFundedPingPong.abi.Events["FeeTokenUpdated"].ID: return _SelfFundedPingPong.ParseFeeTokenUpdated(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["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["OutOfOrderExecutionChange"].ID: return _SelfFundedPingPong.ParseOutOfOrderExecutionChange(log) case _SelfFundedPingPong.abi.Events["OwnershipTransferRequested"].ID: @@ -2598,6 +3233,26 @@ func (SelfFundedPingPongFunded) Topic() common.Hash { return common.HexToHash("0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c") } +func (SelfFundedPingPongMessageAbandoned) Topic() common.Hash { + return common.HexToHash("0xd5038100bd3dc9631d3c3f4f61a3e53e9d466f40c47af9897292c7b35e32a957") +} + +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("0x54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a") +} + +func (SelfFundedPingPongMessageSucceeded) Topic() common.Hash { + return common.HexToHash("0xdf6958669026659bac75ba986685e11a7d271284989f565f2802522663e9a70f") +} + func (SelfFundedPingPongOutOfOrderExecutionChange) Topic() common.Hash { return common.HexToHash("0x05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd9") } @@ -2635,6 +3290,8 @@ type SelfFundedPingPongInterface interface { GetFeeToken(opts *bind.CallOpts) (common.Address, error) + GetMessageContents(opts *bind.CallOpts, messageId [32]byte) (ClientAny2EVMMessage, error) + GetOutOfOrderExecution(opts *bind.CallOpts) (bool, error) GetRouter(opts *bind.CallOpts) (common.Address, error) @@ -2675,10 +3332,6 @@ type SelfFundedPingPongInterface interface { SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) - SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) - - SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) - SetOutOfOrderExecution(opts *bind.TransactOpts, outOfOrderExecution bool) (*types.Transaction, error) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) @@ -2745,6 +3398,36 @@ 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) + + 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) (*SelfFundedPingPongMessageSentIterator, error) + + WatchMessageSent(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongMessageSent) (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) + FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*SelfFundedPingPongOutOfOrderExecutionChangeIterator, error) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *SelfFundedPingPongOutOfOrderExecutionChange) (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 c91e66bd69..ce6b6d6252 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,16 +1,16 @@ GETH_VERSION: 1.13.8 arm_contract: ../../../contracts/solc/v0.8.24/RMN/RMN.abi ../../../contracts/solc/v0.8.24/RMN/RMN.bin 1a0abacf84def916519013f713b667f106434a091af8b9f441e12cc90aa2cdf8 arm_proxy_contract: ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.abi ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.bin b048d8e752e3c41113ebb305c1efa06737ad36b4907b93e627fb0a3113023454 -ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 4fa80572165c135051c8f90db530de2da2ffd5f99101cc59e50fa61f2aabccf2 -ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 928d49f02f9aef05f27072ebe6de798a655f5b6e48fbe5be7dba185888d60384 -ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 74f2cedde31d15d881087da352f82668cfc4a11bce6b6a0af6f8fd0c0718cae5 -ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 4eb6ce9f4b68c766b2c01f37d12a39a89bfa7636330ddc19b9d038de2f76e795 -ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 3e74689a26f094eddf4d2fc8ae16b799dcf8732a2de116748f43f93fba3093e7 burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.bin 1e60c28ad796a220a38043b369dec8d9bffe23e1c7d9895760e30672872afd06 burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin 3e8e3358f0bb520af069a7d37ea625940a88461a54418b1d5925eabced8c74df burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391 burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8 burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597 +ccipClient: ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.abi ../../../contracts/solc/v0.8.24/CCIPClient/CCIPClient.bin 4fa80572165c135051c8f90db530de2da2ffd5f99101cc59e50fa61f2aabccf2 +ccipClientWithACK: ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.abi ../../../contracts/solc/v0.8.24/CCIPClientWithACK/CCIPClientWithACK.bin 928d49f02f9aef05f27072ebe6de798a655f5b6e48fbe5be7dba185888d60384 +ccipReceiver: ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.abi ../../../contracts/solc/v0.8.24/CCIPReceiver/CCIPReceiver.bin 74f2cedde31d15d881087da352f82668cfc4a11bce6b6a0af6f8fd0c0718cae5 +ccipReceiverWithACK: ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.abi ../../../contracts/solc/v0.8.24/CCIPReceiverWithACK/CCIPReceiverWithACK.bin 4eb6ce9f4b68c766b2c01f37d12a39a89bfa7636330ddc19b9d038de2f76e795 +ccipSender: ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.abi ../../../contracts/solc/v0.8.24/CCIPSender/CCIPSender.bin 3e74689a26f094eddf4d2fc8ae16b799dcf8732a2de116748f43f93fba3093e7 ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin 75955a3dcfd66b308be07eda54d6036cc79e87d3cdcf3c5c3115813c55912af8 ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 9e21d63b5a3ea8776dbfa068effcb70e77d3fcc44bc6af3a6a6870f5c4bfe212 commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41 @@ -29,11 +29,10 @@ mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/Mo multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 6b56e0114a4d50797d30a34aecc2641ef340451d0c3fcb9d729bba4df2435122 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536 -ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 5531cf7b66f8f88c49207d8f16f0e7f06b1833ab178471939f1c05c871a16328 -self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 1f41c4136108601c04e9cca14af74a9b3c2f4be82898043f9695542d708940ca ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin 9254b35a86f00fde7b7193a033ca58f6521a66e87b9cf9da6ce5660082e79f5d -offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 2d1cdfd810e2fde409610f4d188889e62a41c8baceb8948849c9a78623a252b6 +offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 4dfdadeb92c5577971c8aaf70c48f119f56b383ca3eed0c8962fc81d58debd92 onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin c37096aaa0369ad988e94c300ba62917e17fcc71a3c1aa3e9b8420f21c0591d2 +ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 9464c687c7c55705a5f2a21903d06de0c49f104eb602e76d4af0c1a2c1031f69 price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2 registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353 report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin 4b9252c443c87ceb7f5ac3b9d100e572fead010f7c39543315052677a3a2c597 @@ -41,6 +40,7 @@ rmn_contract: ../../../contracts/solc/v0.8.24/RMN/RMN.abi ../../../contracts/sol rmn_proxy_contract: ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.abi ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.bin b048d8e752e3c41113ebb305c1efa06737ad36b4907b93e627fb0a3113023454 rmn_remote: ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin be6840d9646195c37f6fa3f95e1cb67218d04d2cebf72e698377b0a7b9cd76f4 router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 2e4f0a7826c8abb49d882bb49fc5ff20a186dbd3137624b9097ffed903ae4888 +self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 3790adbc68fb1ce8deaa2f46892682ef48bddf034403151bfab711136ad50ff4 token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin 942be7d1681ac102e0615bee13f76838ebb0b261697cf1270d2bf82c12e57aeb token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 7c01fd89f5153baa4d7409d14beabb3f861abfbf8880d3c6d06802cc398570f9 usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin 8e7eae4c7277ce4a0092cca815c046cc49094028c23d2d113de9335fa4358030 From cb2849cea34bd554ae751ae36d48991f398bee63 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Sep 2024 11:06:09 -0400 Subject: [PATCH 61/61] formalize comment and formatting cleanup --- contracts/gas-snapshots/ccip.gas-snapshot | 64 ++++++++++++++----- .../applications/external/CCIPReceiver.sol | 18 ++---- .../external/CCIPReceiverWithACK.sol | 10 +-- .../applications/internal/PingPongDemo.sol | 26 ++++---- .../internal/PingPongDemoTest.t.sol | 10 +-- .../receivers/CCIPReceiverReverting.sol | 10 +-- .../receivers/ReentrancyAbuserMultiRamp.sol | 3 +- 7 files changed, 77 insertions(+), 64 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 0f352370f8..4b826eb5c9 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -34,7 +34,17 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28773) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243556) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23951) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2132690) +CCIPClientTest:test_HappyPath_Success() (gas: 192136) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 326581) +CCIPClientTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 218713) +CCIPClientTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 380248) +CCIPClientTest:test_modifyFeeToken_Success() (gas: 74415) +CCIPClientWithACKTest:test_ccipReceiveAndSendAck_Success() (gas: 331013) +CCIPClientWithACKTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415370) +CCIPClientWithACKTest:test_ccipSendAndReceiveAck_in_return_Success() (gas: 346114) +CCIPClientWithACKTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 242924) +CCIPClientWithACKTest:test_ccipSend_with_NativeFeeToken_andNoDestTokens_Success() (gas: 403065) +CCIPClientWithACKTest:test_send_tokens_that_are_not_feeToken_Success() (gas: 552379) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9539) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 66088) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 357846) @@ -87,6 +97,26 @@ CCIPConfig_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 299419) CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 492913) CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9606) +CCIPReceiverTest:test_HappyPath_Success() (gas: 193787) +CCIPReceiverTest:test_Recovery_from_invalid_sender_Success() (gas: 408960) +CCIPReceiverTest:test_Recovery_with_intentional_Revert() (gas: 414462) +CCIPReceiverTest:test_abandonFailedMessage_which_has_not_already_failed_Revert() (gas: 13388) +CCIPReceiverTest:test_apply_InvalidChainUpdate_Revert() (gas: 13841) +CCIPReceiverTest:test_disableChain_andRevert_onccipReceive_Revert() (gas: 200263) +CCIPReceiverTest:test_modifyRouter_Success() (gas: 26455) +CCIPReceiverTest:test_removeSender_from_approvedList_and_revert_Success() (gas: 405377) +CCIPReceiverTest:test_retryFailedMessage_Success() (gas: 423637) +CCIPReceiverTest:test_retryFailedMessage_which_has_not_already_failed_Revert() (gas: 11168) +CCIPReceiverTest:test_withdraw_nativeToken_to_owner_Success() (gas: 20876) +CCIPReceiverWithAckTest:test_attemptACK_message_which_has_already_been_acknowledged_Revert() (gas: 406869) +CCIPReceiverWithAckTest:test_ccipReceive_ack_message_Success() (gas: 53229) +CCIPReceiverWithAckTest:test_ccipReceive_and_respond_with_ack_Success() (gas: 330692) +CCIPReceiverWithAckTest:test_ccipReceiver_ack_with_invalidAckMessageHeaderBytes_Revert() (gas: 415299) +CCIPReceiverWithAckTest:test_feeTokenApproval_in_constructor_Success() (gas: 2831885) +CCIPReceiverWithAckTest:test_modifyFeeToken_Success() (gas: 74830) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andDestTokens_Success() (gas: 340076) +CCIPSenderTest:test_ccipSend_withNonNativeFeetoken_andNoDestTokens_Success() (gas: 224347) +CCIPSenderTest:test_ccipSend_with_NativeFeeToken_andDestTokens_Success() (gas: 371349) CommitStore_constructor:test_Constructor_Success() (gas: 3091326) CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420) CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670) @@ -115,8 +145,6 @@ 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) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) -DefensiveExampleTest:test_Recovery() (gas: 424256) E2E:test_E2E_3MessagesSuccess_gas() (gas: 1100023) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 37782) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 103730) @@ -168,7 +196,7 @@ EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 544641) EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64323) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 122322) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 142532) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 427328) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 1583346) EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18502) EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 278106) EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18668) @@ -192,11 +220,11 @@ EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 274 EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 530151) EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 345758) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187324) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2321912) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 3381693) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362965) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143900) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 366104) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 482682) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 1638915) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 189727) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 153641) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 59894) @@ -690,7 +718,7 @@ OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28459) OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 187534) OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198006) OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40129) -OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 447379) +OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 1603224) OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 247824) OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 192091) OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 211684) @@ -716,9 +744,9 @@ OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 211065) OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26057) OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152806) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 529785) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 1685436) OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 310294) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2389687) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 3441495) OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 162168) OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 223992) OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 224567) @@ -786,11 +814,13 @@ OnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 11359) OnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 16385) OnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 55321) OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97095) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 152669) -PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20277) -PingPong_plumbing:test_Pausing_Success() (gas: 17777) -PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 163187) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 182599) +PingPong_example_ccipReceive:test_CcipReceive_Success() (gas: 180083) +PingPong_example_startPingPong:test_StartPingPong_Success() (gas: 209814) +PingPong_example_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 279194) +PingPong_example_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 204537) +PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 124484) +PingPong_plumbing:test_Pausing_Success() (gas: 17917) +PingPong_plumbing:test_typeAndVersion() (gas: 9741) RMNHome:test() (gas: 186) RMN_constructor:test_Constructor_Success() (gas: 48838) RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19666) @@ -902,9 +932,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: 10986) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55531) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 419466) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20151) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 271268) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 447066) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20161) 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/external/CCIPReceiver.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol index be5158fb7e..903b85596b 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiver.sol @@ -40,12 +40,9 @@ contract CCIPReceiver is CCIPBase { /// not revert, all errors should be handled internally in this contract. /// @param message The message to process. /// @dev Extremely important to ensure only router calls this. - function ccipReceive(Client.Any2EVMMessage calldata message) - external - virtual - onlyRouter - isValidChain(message.sourceChainSelector) - { + function ccipReceive( + Client.Any2EVMMessage calldata message + ) external virtual onlyRouter isValidChain(message.sourceChainSelector) { try this.processMessage(message) {} catch (bytes memory err) { // If custom retry logic is desired, plus granting the owner the ability to extract tokens as a last resort for @@ -68,12 +65,9 @@ contract CCIPReceiver is CCIPBase { /// @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 - onlySelf - isValidSender(message.sourceChainSelector, message.sender) - {} + function processMessage( + Client.Any2EVMMessage calldata message + ) external virtual onlySelf isValidSender(message.sourceChainSelector, message.sender) {} // ================================================================ // │ Failed Message Processing | diff --git a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol index a86db8c248..6b8f68fd13 100644 --- a/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol +++ b/contracts/src/v0.8/ccip/applications/external/CCIPReceiverWithACK.sol @@ -86,13 +86,9 @@ contract CCIPReceiverWithACK is CCIPReceiver { /// @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 /// 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 - isValidSender(message.sourceChainSelector, message.sender) - { + function processMessage( + Client.Any2EVMMessage calldata message + ) external virtual override onlySelf isValidSender(message.sourceChainSelector, message.sender) { (MessagePayload memory payload) = abi.decode(message.data, (MessagePayload)); // message type is a concept with ClientWithACK diff --git a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol index 17a8be93b7..47b7ee05d2 100644 --- a/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol +++ b/contracts/src/v0.8/ccip/applications/internal/PingPongDemo.sol @@ -4,14 +4,13 @@ pragma solidity ^0.8.0; import {Client} from "../../libraries/Client.sol"; import {CCIPClient} from "../external/CCIPClient.sol"; -import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.sol"; import {IRouter} from "../../interfaces/IRouter.sol"; +import {EVM2EVMOnRamp} from "../../onRamp/EVM2EVMOnRamp.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 CCIPClient { - event Ping(uint256 pingPongCount); event Pong(uint256 pingPongCount); event OutOfOrderExecutionChange(bool isOutOfOrder); @@ -58,12 +57,9 @@ contract PingPongDemo is CCIPClient { /// @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) - { + function processMessage( + Client.Any2EVMMessage calldata message + ) external override onlySelf isValidSender(message.sourceChainSelector, message.sender) { if (!s_isPaused) { _respond(abi.decode(message.data, (uint256)) + 1); } @@ -106,20 +102,21 @@ contract PingPongDemo is CCIPClient { return s_isPaused; } - function getOutOfOrderExecution() external view returns (bool) { + function getOutOfOrderExecution() external view virtual returns (bool) { return s_allowOutOfOrderExecution; } - function setOutOfOrderExecution(bool outOfOrderExecution) external onlyOwner { - // It adds gas having the extra storage slot, but the alternative is a bunch of very messy assembly code - // to slice it out of the extra args. + function setOutOfOrderExecution(bool outOfOrderExecution) external virtual onlyOwner { + // An additional storage slot is used for code simplicity. The current storage value can be + // retrieved by parsing the extraArgsBytes field of the chain configuration, but this is not recommended + // as it is more expensive and error-prone by requiring additional parsing logic in raw assembly. s_allowOutOfOrderExecution = outOfOrderExecution; address onRamp = IRouter(s_ccipRouter).getOnRamp(s_counterpartChainSelector); EVM2EVMOnRamp.StaticConfig memory staticConfig = EVM2EVMOnRamp(onRamp).getStaticConfig(); - + // Enabling out of order execution also requires setting a manual gas limit, therefore the on-ramp default - // gas limit is used to ensure consistency, but can be overwritten manually by the contract owner using + // gas limit is used to ensure consistency, but can be overwritten manually by the contract owner using // the applyChainUpdates function. s_chainConfigs[s_counterpartChainSelector].extraArgsBytes = Client._argsToBytes( Client.EVMExtraArgsV2({gasLimit: staticConfig.defaultTxGasLimit, allowOutOfOrderExecution: outOfOrderExecution}) @@ -127,5 +124,4 @@ contract PingPongDemo is CCIPClient { emit OutOfOrderExecutionChange(outOfOrderExecution); } - } diff --git a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol index 8f9f9c06aa..c6d40bf3f9 100644 --- a/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/internal/PingPongDemoTest.t.sol @@ -29,10 +29,10 @@ contract PingPongDappSetup is EVM2EVMOnRampSetup { } contract PingPong_example_startPingPong is PingPongDappSetup { - uint256 pingPongNumber = 1; - bytes data = abi.encode(pingPongNumber); + uint256 pingPongNumber = 1; + bytes data = abi.encode(pingPongNumber); - function test_StartPingPong_Success() public { + function test_StartPingPong_Success() public { Client.EVM2AnyMessage memory sentMessage = Client.EVM2AnyMessage({ receiver: abi.encode(i_pongContract), data: data, @@ -170,7 +170,7 @@ contract PingPong_example_ccipReceive is PingPongDappSetup { contract PingPong_plumbing is PingPongDappSetup { function test_Fuzz_CounterPartChainSelector_Success(uint64 chainSelector) public { vm.assume(chainSelector != 0); - + s_pingPong.setCounterpart(chainSelector, address(0x1234)); assertEq(s_pingPong.getCounterpartChainSelector(), chainSelector); @@ -205,7 +205,7 @@ contract PingPong_plumbing is PingPongDappSetup { function test_typeAndVersion() public view { assertEq(s_pingPong.typeAndVersion(), "PingPongDemo 1.6.0-dev"); } - + function test_OutOfOrderExecution_Success() public { assertFalse(s_pingPong.getOutOfOrderExecution()); 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 444b066955..f6e384edbd 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/CCIPReceiverReverting.sol @@ -16,13 +16,9 @@ contract CCIPReceiverReverting is CCIPReceiver { /// @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 - view - override - onlySelf - isValidSender(message.sourceChainSelector, message.sender) - { + function processMessage( + Client.Any2EVMMessage calldata message + ) external view override onlySelf isValidSender(message.sourceChainSelector, message.sender) { // Meant to help simulate a failed-message if (s_simRevert) revert ErrorCase(); } 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 4467458dac..674f02537d 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol @@ -4,8 +4,9 @@ pragma solidity ^0.8.19; import {Client} from "../../../libraries/Client.sol"; import {Internal} from "../../../libraries/Internal.sol"; import {EVM2EVMOffRamp} from "../../../offRamp/EVM2EVMOffRamp.sol"; -import {CCIPReceiverBasic} from "./CCIPReceiverBasic.sol"; + import {OffRamp} from "../../../offRamp/OffRamp.sol"; +import {CCIPReceiverBasic} from "./CCIPReceiverBasic.sol"; contract ReentrancyAbuserMultiRamp is CCIPReceiverBasic { event ReentrancySucceeded();